Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

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.040
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.040
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.040
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 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
  #8  
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
  #9  
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



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


La franja horaria es GMT +2. Ahora son las 21:24:52.


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