database - 为什么 Firebird 的存储过程中不允许使用临时表?

标签 database stored-procedures temp-tables firebird-3.0

我正在尝试在 Firebird 数据库的存储过程中创建临时表。

我的存储过程 list :

SET TERM ^ ;

CREATE PROCEDURE initNATIONALHEALTHFUNDS
 
AS BEGIN

  CREATE GLOBAL TEMPORARY TABLE temp_FUNDS 
  (
    NATIONALHEALTHFUNDID Integer NOT NULL,
    NAME Varchar(128) NOT NULL,
    CODE Integer NOT NULL
  )
  ON COMMIT PRESERVE ROWS;
  commit;
  
 INSERT INTO tempFUNDS (NATIONALHEALTHFUNDID, CODE, NAME)  VALUES ( 01 ,01 , 'Some Foundation');

    
  MERGE INTO NATIONALHEALTHFUNDS  AS target 
   USING tempFUNDS AS source 
   ON target.NATIONALHEALTHFUNDID = source.NATIONALHEALTHFUNDID
   WHEN NOT MATCHED THEN 
    INSERT (NATIONALHEALTHFUNDID, CODE, NAME) VALUES (source.NATIONALHEALTHFUNDID, source.CODE, source.NAME);
    
  drop  TABLE tempFUNDS;
END^

SET TERM ; ^

每次我尝试创建这个程序时,我都会收到错误消息:

    Engine Code    : 335544569
Engine Message :
Dynamic SQL Error
SQL error code = -104
Token unknown - line 7, column 3
CREATE


Total execution time: 0.015s

我做错了什么?我正在使用 Firebird 3.0 RC

最佳答案

Firebird 不允许您在存储过程中使用 DDL,因此 CREATE 语句在 PSQL 中是不允许的。如 answer by lad2025 中所示您可以使用 EXECUTE STATEMENT 解决此限制.

然而,global temporary table背后的想法是你创建一次,它们继续存在,以便以后使用。数据仅对创建数据的连接可见,数据在事务提交(ON COMMIT DELETE ROWS)或连接关闭(ON COMMIT PRESERVE ROWS)后删除取决于全局临时表的类型。

来自 Firebird 3.0 语言引用:

Global temporary tables have persistent metadata, but their contents are transaction-bound (the default) or connection-bound. Every transaction or connection has its own private instance of a GTT, isolated from all the others. Instances are only created if and when the GTT is referenced. They are destroyed when the transaction ends or on disconnection.

因此,与其尝试在存储过程中创建全局临时表,不如先创建它,然后再创建使用已定义的 GTT 的存储过程。

关于database - 为什么 Firebird 的存储过程中不允许使用临时表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33972725/

相关文章:

C# WebAPI 交叉更新多个表的内连接数据

mysql工作台程序计算

database - Postgres : Do I need to create temporary tables in each session?

sql - #temp_table 与用户。#temp_table sybase_iq

mysql - Rails 临时表

database - 三个客户地址在一个表中还是在不同的表中?

php - MySQL 查询 MATCH 和 AGAINST 挂起

mysql - 指定在 MySQL 中查找行的概率

c# - 转换为存储过程

java - 一旦我有了 SQLServer 的名称,我如何在 java 中列出它的数据库?