Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   DB2 (https://www.clubdelphi.com/foros/forumdisplay.php?f=33)
-   -   Ejecutar un store procedure dinamico en DB2 (https://www.clubdelphi.com/foros/showthread.php?t=42501)

DaniMan 16-04-2007 16:39:35

Ejecutar un store procedure dinamico en DB2
 
Hola mi nombre es daniel y queria saber si alguien me puede decir si puedo ejecutar un query dinamico. Me comentaron que se puede meter el sql en un string y concatenar la variante dinamica .... pero no se si esto es tan asi y mediante que comandos puedo ejecutar el string_sql ....

Saludos y Gracias.

Lepe 16-04-2007 17:37:33

La verdad, el título del mensaje no se corresponde mucho con la pregunta, no sé si me pierdo algo.

Hay 2 formas de hacerlo, en ambas tienes que partir de un componente Query, (TQuery, TIBQuery, TMDOQuery... depende de tu base de datos):

- El rompecabezas, es igual que armar un puzzle.
Código Delphi [-]
var select, LaSql:string;
    
begin 

select := ' select * from tabla';
LaSql := select + ' where codigo = ' + inttostr(edit1.text);
LaSql := LaSql + ' and nombre = '+ QuotedStr(edit2.text);
query1.sql.text := LaSql;
query1.Open;
end;
Como ves, tienes que tener en cuenta todos los espacios en blanco, las uniones de unas cadenas con otras, etc. Basta un error de un paréntesis para que todo se vaya al traste.


- Por parámetros: Partimos de la base que sabemos cuantos parámetros se van a usar en la búsqueda, preparamos en el TQuery un sql así:
Código SQL [-]
select from tabla 
where codigo = :elcodigo and nombre = :elnombre
Ahora en delphi:
Código Delphi [-]
query1.parambyname('elcodigo').asInteger := strtoint(edit1.text);
query1.parambyname('elnombre').asString:= edit2.text;
query1.Open;

Saludos

DaniMan 17-04-2007 20:04:18

Ok, muchas gracias, pero la verdad que lo que tengo que hacer es mucho mas complicado de lo que me parecia.
El contenido original del store es el que tengo marcado en rojo y en negrita, lo que tengo que hacer es cambiar el order by de acuerdo del ID_COMERCIO.
Lo marcado en azul e italica es lo nuevo. La verdad que no se me ocurre como hacerlo de forma dinamica o concatenando el order by en un string y luego ejecutarlo con EXEC.

Si alguien me puede dar una mano se lo agradecere mucho ....

Tengo el sgte store procedure ....

create procedure desa01.prueba0 (in ID_USUARIO char(20),
IN ID_COMERCIO integer,
IN ID_ENTIDAD decimal(10),
in ID_SUCURSAL decimal(10))
dynamic result sets 1
language sql
begin

declare c1 cursor with return for
with cuits_habilitados(cuit) as(select cuit from table(desa01.TKNS002(id_usuario)) as cuits),
paises_habilitados(pais) as(select pais from table(desa01.TKNS003(id_usuario)) as paises)
select d.sucursal_comercio,
d.digito_verificador,
d.denominacion,
d.cuit,
d.ramo_comercio,
d.descripcion_ramo,
d.unificadora,
d.sucursal_entidad,
d.baja,
d.nombre_entidad,
d.nombre_sucursal
from desa01.TKT039 c,table(desa01.TKN0003(c.sucursal_comercio)) as d
where c.SUCURSAL_COMERCIO>=ID_COMERCIO and
d.unificadora>=ID_ENTIDAD and
d.sucursal_entidad>=ID_SUCURSAL and
( (desa01.TKNS001(id_usuario)='I' and c.pais in (select pais from paises_habilitados)) or
(desa01.TKNS001(id_usuario)='C' and c.cuit in (select cuit from cuits_habilitados)) or
(desa01.TKNS001(id_usuario)='B' and (select u.cuit
from desa01.tkv070 u where u.unificadora=d.unificadora ) in (select cuit from cuits_habilitados))
)
order by d.unificadora, sucursal_entidad, d.sucursal_comercio
fetch first 201 rows only;--
open c1;--

if ID_COMERCIO = 0 then
// ordena el query por
// d.unificadora,d.sucursal_entidad,d.sucursal_comercio
else
// ordena el query por
// d.sucursal_comercio, d.unificadora, d.sucursal_entidad
end if;--


end;

poliburro 18-04-2007 19:52:40

la ejecución de consultas dinámicas en Db2 se hace de la siguiente manera:

Código SQL [-]
prepare consultaDinamica FROM   'ConsultaIinicial  ?';
Declare VVConsultaDinamica Varchar(2000);
                 
if condicion Then
  Set VVConsultaDinamica  = "Sentencia nueva";
else
  Set VVConsultaDinamica  =  "Otra Sentencia";
End If;
execute consultaDinamica using VVConsultaDinamica;

Por cierto deberias indentar tus consultas, para hacer más sencilla su lectura

DaniMan 18-04-2007 23:05:27

Ok, gracias por la info, pero no se si realmente me sirve porque en el query aparece el un declare cursor, dinamico y no se como hacer esto que me comentas del query dinamico si esta relacionado con el declare cursor. Se puede declarar un cursor vacio y despues cargarlo con el sql dinamico ?

En cuanto a la indentacion,creeme que al copiarlo y pegarlo lo dejo asi, no es mi manera de indentar ni mucho menos :)

poliburro 19-04-2007 06:16:11

Ok, como sabes, en db2/400 los recordsets deben ser declarados en un cursor, de tal manera que al hacer el open, el Sp devolverá los resultados.

Esto funciona así con las consultas definidas, pero en tu caso al ser una consulta dinámica, la función del cursor la hace el prepare.

:). Puedes checar la documentación de Db2 en el Sitio de Ibm, con respecto al prepare y al exec. y veras que es como te lo acabo de ejemplificar.

Suerte.


La franja horaria es GMT +2. Ahora son las 18:09:21.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi