Saltar al contenido

¿Por qué la tabla temporal no está permitida en el procedimiento almacenado en Firebird?

Solución:

Firebird no le permite usar DDL dentro de procedimientos almacenados, por lo que CREATE Las declaraciones no están permitidas en PSQL. Como se indica en la respuesta de lad2025, puede solucionar esta limitación utilizando EXECUTE STATEMENT.

Sin embargo, la idea detrás de un global tabla temporal es que la crea una vez, y siguen existiendo para que se puedan usar más tarde. Los datos solo son visibles para la conexión que creó los datos, y los datos se eliminan después de la confirmación de la transacción (ON COMMIT DELETE ROWS) o cierre de conexión (ON COMMIT PRESERVE ROWS) según el tipo de tabla temporal global.

De la referencia de lenguaje de Firebird 3.0:

Las tablas temporales globales tienen metadatos persistentes, pero su contenido está vinculado a la transacción (el valor predeterminado) o vinculado a la conexión. Cada transacción o conexión tiene su propia instancia privada de GTT, aislada de todas las demás. Las instancias solo se crean cuando se hace referencia al GTT. Se destruyen cuando finaliza la transacción o al desconectarse.

Entonces, en lugar de intentar crear la tabla temporal global dentro de su procedimiento almacenado, créelo primero, luego cree su procedimiento almacenado que usos el GTT ya definido.

De la documentación de GTT:

CREAR TABLA TEMPORAL GLOBAL

es una sentencia DDL regular que es procesada por el motor de la misma forma que se procesa una sentencia CREATE TABLE. En consecuencia, no es posible crear o eliminar un GTT dentro de un procedimiento almacenado o desencadenador.

Puede usar Dynamic-SQL y envolver su código con EXECUTE STATEMENT como solución alternativa:

SET TERM ^ ;

CREATE PROCEDURE initNATIONALHEALTHFUNDS
AS BEGIN

EXECUTE STATEMENT
  'CREATE GLOBAL TEMPORARY TABLE temp_FUNDS 
  (
    NATIONALHEALTHFUNDID Integer NOT NULL,
    NAME Varchar(128) NOT NULL,
    CODE Integer NOT NULL
  )
  ON COMMIT PRESERVE ROWS;
  commit;';

 ...

END^
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *