Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Execute Statement (https://www.clubdelphi.com/foros/showthread.php?t=91007)

rruffino 24-10-2016 18:21:02

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!!

Casimiro Notevi 24-10-2016 18:41:18

Echa un vistazo a los mensajes de abajo, al final de página, a ver si te sirven.

rruffino 24-10-2016 18:52:03

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!

Casimiro Notevi 24-10-2016 18:54:11

Pues entonces no será el código que has puesto, porque ahí no hay 41 líneas.

rruffino 24-10-2016 19:07:08

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!

Casimiro Notevi 24-10-2016 20:49:54

No recuerdo que puedas pasar parámetros, debes crear la sentencia completa antes de lanzarla con execute statement

Al González 24-10-2016 21:10:39

No te compliques. Concatena el valor directamente:

Código:

... || :num_cuenta

rruffino 24-10-2016 21:21:12

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!

Casimiro Notevi 24-10-2016 21:27:28

Pon los valores entre comillas si son cadenas:
Código:

and codigocuenta='||''''||old.codigocuenta||'''';

rruffino 24-10-2016 21:31:14

Eureka
 
Correcto señores, ahí quedo funcionando perfectamente...
Les agradezco la ayuda.
Saludos!

rruffino 25-10-2016 22:45:28

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!!

Caminante 25-10-2016 23:01:46

Hola

Aqui explican como usar execute statement con parametros.

Espero te sea util

Saludos

rruffino 25-10-2016 23:09:36

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!

Casimiro Notevi 25-10-2016 23:25:52

Recuerda que las fechas son números double.

Caminante 26-10-2016 00:11:57

Cita:

Empezado por rruffino (Mensaje 509972)
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

rruffino 26-10-2016 01:03:16

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.

ecfisa 26-10-2016 14:19:24

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


La franja horaria es GMT +2. Ahora son las 09:38:26.

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