Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-10-2016
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 20
rruffino Va por buen camino
Question Execute Statement

Hola, buen día...
Estoy definiendo un proceso almacenado que toma varios parámetros de entrada. Con esos parametros de entrada armo una cadena llamada SENTENCIA, y armo la consulta de la siguiente manera:
Código SQL [-]
sentencia='select TALBA.CAMPO1, TABLA.CAMPO2 from TABLA where TABLA.ID=1';

if(:num_cuenta<>-1)then
  sentencia=:sentencia || ' and TABLA.NUM_CUENTA=:a';   

sentencia=:sentencia || ' order by TABLA.CAMPO3';
    
for EXECUTE STATEMENT (:sentencia) (a:=num_cuenta) into :c1, :c2 do
SUSPEND;

El error se produce al compilar, donde no me reconoce el ( de la variable sentencia. Lo he probado sin parentesis y tambien lo he probado con parametros localizados y persiste el error. Utilizo firebird 2.1. Alguna sugerencia????
Gracias de antemano!!
Responder Con Cita
  #2  
Antiguo 24-10-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Echa un vistazo a los mensajes de abajo, al final de página, a ver si te sirven.
Responder Con Cita
  #3  
Antiguo 24-10-2016
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 20
rruffino Va por buen camino
Sigue el problema

Hola, gracias por la respuesta.... he leído los hilos, pero no he podido solucionarlo. El error puntual es:
Código SQL [-]
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 41, column 35.
(.
Saludos!
Responder Con Cita
  #4  
Antiguo 24-10-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pues entonces no será el código que has puesto, porque ahí no hay 41 líneas.
Responder Con Cita
  #5  
Antiguo 24-10-2016
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 20
rruffino Va por buen camino
Error

En realidad si, tengo las 41 lineas y sobre la linea 41 cae la línea del error, que lo he separado y el error esta cuando paso los parámetros, es decir en donde dice
Código SQL [-]
(a:=num_cuenta)

Si no le paso ese valor, compila, pero después al correrlo me dice que no conoce a "A"... he buscado por todos lados y toda la documentacion dice lo mismo, pero la realidad es que no me compila.
Saludos!
Responder Con Cita
  #6  
Antiguo 24-10-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No recuerdo que puedas pasar parámetros, debes crear la sentencia completa antes de lanzarla con execute statement
Responder Con Cita
  #7  
Antiguo 24-10-2016
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
No te compliques. Concatena el valor directamente:

Código:
 ... || :num_cuenta
Responder Con Cita
  #8  
Antiguo 24-10-2016
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 20
rruffino Va por buen camino
Va funcionando!

Correcto, concatenando el valor directamente funciona, solo que ahora tengo el problema cuando en lugar de comparar por un valor lo hago con por ejemplo el "satarting with" o el like, como:
Código SQL [-]
'nombre starting with ' || :nombre
Al correrlo, me dice que la columna XX no existe, siendo XX la cadena que paso como parámetro de búsqueda para el campo nombre.
Alguna sugerencia?
Gracias!
Responder Con Cita
  #9  
Antiguo 24-10-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pon los valores entre comillas si son cadenas:
Código:
and codigocuenta='||''''||old.codigocuenta||'''';
Responder Con Cita
  #10  
Antiguo 24-10-2016
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 20
rruffino Va por buen camino
Eureka

Correcto señores, ahí quedo funcionando perfectamente...
Les agradezco la ayuda.
Saludos!
Responder Con Cita
  #11  
Antiguo 25-10-2016
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 20
rruffino Va por buen camino
Fe de erratas!!!

Bueno, pasando valores en numeros o string no he tenido problemas.... el problema surge cuando quiero pasarle fechas, por ejemplo:
Código SQL [-]
'TABLA.FECHA_SOLICITUD>=' || :desde

Me da el error
"Expression evaluation not supported"
La variable desde es de tipo DATE.
Saludos!!
Responder Con Cita
  #12  
Antiguo 26-10-2016
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
Hola

Aqui explican como usar execute statement con parametros.

Espero te sea util

Saludos
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #13  
Antiguo 26-10-2016
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 20
rruffino Va por buen camino
Sigo igual

hola Caminante, gracias por la respuesta.
En realidad lo habiamos visto pero me tira el error de que no compila porque no reconoce los parentesis cuando quiero especificar los parametros ya sea nombrados o por valor posicional. Por eso resolvimos concatenando las variables, pero en las que tienen tipo fecha no me deja, me da el error mencionado en el mensaje anterior.
Saludos!
Responder Con Cita
  #14  
Antiguo 26-10-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Recuerda que las fechas son números double.
Responder Con Cita
  #15  
Antiguo 26-10-2016
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
Cita:
Empezado por rruffino Ver Mensaje
Código SQL [-]sentencia='select TALBA.CAMPO1, TABLA.CAMPO2 from TABLA where TABLA.ID=1'; if(:num_cuenta<>-1)then sentencia=:sentencia || ' and TABLA.NUM_CUENTA=:a'; sentencia=:sentencia || ' order by TABLA.CAMPO3'; for EXECUTE STATEMENT (:sentencia) (a:=num_cuenta) into :c1, :c2 do SUSPEND;

Veo que usas dos puntos antes de la sentencia como si fuera un parametro. Yo no recuerdo que sea asi (Alguna vez use execute statement con parametros, aunque no tengo el codigo a mano para verificarlo).

Saludos
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #16  
Antiguo 26-10-2016
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 20
rruffino Va por buen camino
Respuesta

Correcto, en principios tenia los dos puntos, como si fuera parámetro, luego lo tengo cambiado y funcionando, salvo cuando quiero pasar fechas.
Saludos.
Responder Con Cita
  #17  
Antiguo 26-10-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola rruffino.

No tengo a mano la versión 2.1 como para probar, pero creo que no tendrías problemas enviando parámetros del tipo DATE, al modo de este ejemplo:
Código SQL [-]
SET TERM ^ ;

CREATE OR ALTER PROCEDURE SP_TEMP2 (
    P_FECHA DATE )
RETURNS (     
    FEC DATE,
    COD VARCHAR(10),
    ART VARCHAR(40))
AS
DECLARE VARIABLE STMT VARCHAR(500);
BEGIN
  FOR EXECUTE STATEMENT
    'SELECT FECHA, COD_FACT, ARTICULO ' ||
    'FROM VENTAS WHERE FECHA <= ' || :P_FECHA
  INTO
    :FEC,
    :COD,
    :ART
  DO BEGIN
    SUSPEND;
  END
END^

SET TERM ; ^

Si usaras la versión 2.5 o superior, podes hacer uso de parámetros dinámicos como en los siguientes ejemplos:

. Usando parámetros con nombre.
Código SQL [-]
SET TERM ^ ;

CREATE OR ALTER PROCEDURE SP_TEMP (
    P_FECHA DATE )
RETURNS (     
    FEC DATE,
    COD VARCHAR(10),
    ART VARCHAR(40))
AS
DECLARE VARIABLE STMT VARCHAR(500);
BEGIN
  STMT = 'SELECT FECHA, COD_FACT, ARTICULO ' ||
         'FROM VENTAS WHERE FECHA <= :A';

  FOR EXECUTE STATEMENT (:STMT)(A := :P_FECHA)
  INTO
    :FEC,
    :COD,
    :ART
  DO BEGIN
    SUSPEND;
  END
END^

SET TERM ; ^

. Usando parámetros sin nombre.
Código SQL [-]
SET TERM ^ ;

CREATE OR ALTER PROCEDURE SP_TEMP (
    P_FECHA DATE )
RETURNS (     
    FEC DATE,
    COD VARCHAR(10),
    ART VARCHAR(40))
AS
DECLARE VARIABLE STMT VARCHAR(500);
BEGIN
  STMT = 'SELECT FECHA, COD_FACT, ARTICULO ' ||
         'FROM VENTAS WHERE FECHA <= ?';

  FOR EXECUTE STATEMENT (:STMT)(:P_FECHA)
  INTO
    :FEC,
    :COD,
    :ART
  DO BEGIN
    SUSPEND;
  END
END^

SET TERM ; ^
Los tres ejemplos de SP se pueden llamar del mismo modo:
Código SQL [-]
SELECT FEC, COD, ART FROM SP_TEMP( '19.4.2016' )

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Error EXECUTE STATEMENT tonyskl Firebird e Interbase 3 22-01-2009 11:07:17
Execute statement Ana Tudela Firebird e Interbase 7 12-12-2006 13:27:13
Problema con execute statement Ivanzinho Firebird e Interbase 3 29-12-2005 10:25:00
Execute Statement jwmoreira Firebird e Interbase 12 22-05-2005 21:55:27
for execute statement conquer Firebird e Interbase 0 16-02-2005 23:23:49


La franja horaria es GMT +2. Ahora son las 14:30:24.


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