PDA

Ver la Versión Completa : Ejecutar un store procedure dinamico en DB2


DaniMan
16-04-2007, 16:39:35
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.

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í:

select from tabla
where codigo = :elcodigo and nombre = :elnombre
Ahora en 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:


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.