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)
-   -   Nombre de Tabla Por Parametros en Firebird (https://www.clubdelphi.com/foros/showthread.php?t=62712)

enriquillo 09-01-2009 17:03:42

Nombre de Tabla Por Parametros en Firebird
 
Hola amigos todos.

Me gustaria saber si es posibre que se pueda pasar el nombre de una tabla por parametros, ya sea a un query o a un procedimiento en una base de datos en firebird 2.1.

Por ejemplo:

declare variable Nombre_Tabla varchar(30);
declare variable Ano_Consulta Integer;

if (:Ano_Consulta < 2008) then
Nombre_Tabla = 'Datos_Viejos'
else
Nombre_Tabla = 'Datos_Nuevos'

Select campo1, campo2, campo3 from :Nombre_Tabla

Me gustaria saber si esto es posible hacerse. :confused:

Saludos y gracias anticipadas.

Enriquillo.

RolphyReyes 09-01-2009 18:20:18

Saludos.

Es posible, pero debes de utilizar la sentencia EXECUTE STATEMENT.

Así que te recomiendo documentarte sobre la misma.

enriquillo 09-01-2009 21:56:10

Muchas Gracias Amigo
 
Voy a intentar documentarme al respecto.

Luego posteo mis resultados.

AzidRain 09-01-2009 22:43:30

Extension de SQL : EXECUTE STATEMENT
Implementa la capacidad de tomar una cadena como una sentencia dinámica SQL
válida y la ejecuta como si se hubiera enviado al motor.
Se peude utilizar en triggers y procedimientos almacenados.

Hay tres sintaxis:

Syntaxis 1
========

EXECUTE STATEMENT <string>;

Ejecuta <string> como una operacion SQL que no devuelve datos.

Se pueden ejecutar los siguientes comandos:

* Insert, Delete y Update.
* Ejecutar un procedimiento.
* Cualquier DDL (excepto Create/Drop Database).

Ejemplo:
Código SQL [-]
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

Sintaxis 2
=========

EXECUTE STATEMENT <string> INTO :var1, ., :varn;

Ejecuta <string> como una operación SQL que regresa una única fila.
Solo pueden ejecutarse SELECT's simples con esta sintaxis.

Ejemplo:
Código SQL [-]

CREATE PROCEDURE DynamicSampleTwo (TableName VARCHAR(100))
AS
DECLARE VARIABLE Par INT;

BEGIN
EXECUTE STATEMENT 'SELECT MAX(CheckField) FROM ' || TableName INTO :Par;
IF (Par > 100) THEN
  EXCEPTION Ex_Overflow 'Desbordamiento en ' || TableName;
END

Sintaxis 3
========

FOR EXECUTE STATEMENT <string> INTO :var1, ., :varn DO
<compound-statement>;

Ejecuta <string> como una operación que devuelve varias filas. Se puede
usar cualquier tipo de SELECT.

Ejemplo:
Código SQL [-]

CREATE PROCEDURE DynamicSampleThree (TextField VARCHAR(100), TableName VARCHAR(100))
  RETURNING_VALUES (Line VARCHAR(32000))
AS
DECLARE VARIABLE OneLine VARCHAR(100);

BEGIN
Line = '';
FOR EXECUTE STATEMENT 'SELECT ' || TextField || ' FROM ' || TableName
  INTO :OneLine
DO
  IF (OneLine IS NOT NULL) THEN
    Line = Line || OneLine || ' ';
SUSPEND;
END

N O T A S
=========
I. En todas las formas de este comando, la cadena DSQL no puede
contener ningún parámetro. Todas las variables deben sustituirse en
la parte estática del comando antes de llamar a EXECUTE STATEMENT.

EXECUTE STATEMENT es potencialmente peligroso, porque:

1. En tiempo de compilación no se verifica que la sentencia SQL sea correcta.
No se pueden verificar los valores devueltos (sintaxis 2 y 3)

2. No se pueden verificar dependencias para asegurarse que los objetos
utilizados en la sentencia SQL no sean borrados de la base de datos o
modificados de manera que la sentencio original ya no sea válida.
Por ejemplo, un DROP TABLE en la tabla que se utiliza dentro del comando
que se le pasa a EXECUTE PROCEDURE será aceptado como válido.
3. Por lo regular, las operaciones con EXECUTE STATEMENT son lentas debido a
que la setencia debe ser preparada cada vez que se usa este comando.


II. Si el procedimiento almacenado tiene privilegios especiales son algunos objetos,
la cadena que contiene la sentencia dinámica que se le pasa a EXECUTE STATEMENT
no los hereda. Los privilegios siguen siendo aplicables al usuario que utiliza el comando.

Original de :
Alex Peshkoff

Traducción: mía.


La franja horaria es GMT +2. Ahora son las 00:17:39.

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