Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   FireBird 1.5 RC8 y nuevas funcionalidades??? (https://www.clubdelphi.com/foros/showthread.php?t=7281)

mosorio 10-02-2004 19:05:24

FireBird 1.5 RC8 y nuevas funcionalidades???
 
Hola,
Leyendo las nuevas funcionalidades de FB1.5 RC8, he intentado hacer unas pruebas pero nome funciona o al aprecer no lo he entendido.
En los ejemplos que colocan, se dice que se permite ejecutar una sentencia mediante una cadena. Es decir en un procedimiento almancenado o un trigger se puede ejecutar un "EXECUTE STATEMENT" y una cadena sql, pero al intentar hacerlo no lo hace, me da errores.
En el documento de la release traducido al español, dice:
Cita:

(1.5) EXECUTE STATEMENT
Alex Peshkov
Extensión PSQL que admite una cadena de caracteres la cual es una consulta DSQL (dynamic SQL) y la
ejecuta como si hubiera sido enviada a DSQL.
Disponible en triggers y procedimientos almacenados.
La sintaxis puede tener tres variantes.
Sintaxis 1
Ejecuta <cadena> como una operación SQL que no devuelve ningún registro, es decir INSERT, UPDATE,
DELETE, EXECUTE PROCEDURE o cualquier sentencia DDL excepto CREATE/DROP DATABASE.

EXECUTE STATEMENT <cadena>;

Ejemplo
CREATE PROCEDURE DynamicSampleOne (Pname VARCHAR(100))
AS
DECLARE VARIABLE Sql VARCHAR(1024);
DECLARE VARIABLE Par INT;
BEGIN
SELECT MIN(SomeField) FROM SomeTable INTO :Par;
Sql = ’EXECUTE PROCEDURE ’ || Pname || ’(’;
Sql = Sql || CAST(Par AS VARCHAR(20)) || ’)’;
EXECUTE STATEMENT Sql;
END
Osea que puedo ejecutar "cualquier" tipo de sentencia excepto crear o eliminar bases de datos.
Lo que intento hacer es:
Cita:

CREATE PROCEDURE GENERAR(GENERADOR VARCHAR(40))
RETURNS(IDVALOR INTEGER)
AS
BEGIN
EXECUTE STATEMENT 'GEN_ID(' || GENERADOR || ',1)' || INTO :IDVAL;
END;
En teoría esto debe funcionar, si hay algo herrado, por favor indicarmelo y si es un fallo o un bug que lo dudo también.
El error que da haciendo la prueba en IBExpert personal es que el token GEN_ID no existe.
El procedure lo permite crear sin problemas, pero la ejecución no da buenos resultados.

Gracias de antemano.

kinobi 10-02-2004 19:22:11

Hola,

Cita:

Empezado por mosorio
El procedure lo permite crear sin problemas, pero la ejecución no da buenos resultados.

es lo esperado, ya que el parser espera una cadena y puedes pasarle lo que quieras (siempre que sea una cadena). Otro asunto es lo que ocurrirá en tiempo de ejecución.

Aunque no puedo probarlo ahora, yo probaría con esto:

Código:

CREATE PROCEDURE GENERAR(GENERADOR VARCHAR(40))
RETURNS(IDVALOR INTEGER)
AS BEGIN
  EXECUTE STATEMENT 'IDVALOR = GEN_ID(' || GENERADOR || ',1)';
END;

Saludos.

mosorio 11-02-2004 13:54:36

Hola Kinobi
Lamento informarte que la opción que has dado no funciona.
En la parte más abajo del documento dice que primero se debe armar la sentencia y luego ejecutar la cadena; pero igüalmente da el mismo resultado, siempre da error.

Si llegas a realizar las pruebas dime si te ha resultado, seguiré intentandolo haber cual sale.

guillotmarc 11-02-2004 14:33:15

Hola.

Tal como lo veo, tienes que utilizar la Sintaxis 2, puesto que el comando ejecutado devuelve un valor.

execute statement 'select gen_id(' || GENERADOR || ',1) from rdb$database' into :IDVALOR;

Nota: Lo acabo de probar, y solo hay que tener en cuenta que IDVALOR debe ser un BIGINT y no un INTEGER.

Saludos

guillotmarc 11-02-2004 14:35:05

Por cierto, esta es la ultima revisión de las Release Notes en castellano :

http://www.ibphoenix.com/downloads/F...tesSpanish.pdf

Saludos.


La franja horaria es GMT +2. Ahora son las 10:23:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi