Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > DB2
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-04-2007
DaniMan DaniMan is offline
Registrado
 
Registrado: abr 2007
Posts: 3
Poder: 0
DaniMan Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 16-04-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 17-04-2007
DaniMan DaniMan is offline
Registrado
 
Registrado: abr 2007
Posts: 3
Poder: 0
DaniMan Va por buen camino
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;
Responder Con Cita
  #4  
Antiguo 18-04-2007
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
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
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #5  
Antiguo 18-04-2007
DaniMan DaniMan is offline
Registrado
 
Registrado: abr 2007
Posts: 3
Poder: 0
DaniMan Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 19-04-2007
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
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.
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Store procedure php jorgito MySQL 1 06-06-2006 08:55:12
Store Procedure en intebase jgutti Firebird e Interbase 2 12-05-2006 15:12:55
Sql dinamico en procedure StartKill Firebird e Interbase 4 27-11-2004 16:04:54
Cómo poder ejecutar un Store Procedure(Prodecimiento alamcenado) thecarlos Varios 1 08-01-2004 23:36:49
store procedure ronimaxh Firebird e Interbase 2 24-06-2003 20:20:22


La franja horaria es GMT +2. Ahora son las 20:39:35.


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
Copyright 1996-2007 Club Delphi