尝试在 DB2 的 SPROC 中重命名多个表时出错

Getting error when trying to Rename multiple tables in SPROC in DB2

我创建了一个 DB2 sql 脚本来填充静态 table,然后进行重命名以将实时 table 替换为新更新的脚本。这是一个相当大的 SQL 脚本,所以我只包括我有错误的区域。

我收到错误:“[IBM][CLI 驱动程序][DB2/NT64] SQL0104N 在“D_HOLIDAY_LOG_OLD 之后发现了一个意外的标记“RENAME”; ”。预期的标记可能包括:“TRUNCATE”。LINE NUMBER=382。SQLSTATE=42601”。

我怀疑,这是 RENAME 命令的语法问题。如果我需要添加整个查询,我可以。提前致谢

CREATE OR REPLACE PROCEDURE NSD_HOLIDAY_LOG_SPROC()
LANGUAGE SQL
SPECIFIC SP_NSD_HOLIDAY_LOG_SPROC
DYNAMIC RESULT SETS 1
BEGIN

COMMIT;
TRUNCATE TABLE TMWIN.NSD_HOLIDAY_LOG immediate;
DROP TABLE NSD_HOLIDAY_LOG_OLD;
RENAME TABLE TMWIN.NSD_HOLIDAY_LOG_LIVE TO NSD_HOLIDAY_LOG_OLD;
RENAME TABLE TMWIN.NSD_HOLIDAY_LOG TO NSD_HOLIDAY_LOG_LIVE;
RENAME TABLE TMWIN.NSD_HOLIDAY_LOG_OLD TO NSD_HOLIDAY_LOG;

END@

这是经常被问到的问题。

当您在 SQL PL 存储过程中使用静态 SQL 时,您必须遵循 Compound SQL (Compiled) 语句块的文档化规则。

其中一条规则是静态 SQL 有一组受限制的语句可以出现在这样的代码块中。

例如,对于当前版本的 Db2-LUW,您不能静态 使用以下任何一项(包括重命名 table): ALTER , CONNECT,CREATE, DESCRIBE, DISCONNECT, DROP, FLUSH EVENT MONITOR, FREE LOCATOR, GRANT, REFRESH TABLE, RELEASE (connection only), RENAME TABLE, RENAME TABLESPACE, REVOKE, SET CONNECTION, SET INTEGRITY, SET PASSTHRU, SET SERVER OPTION ,TRANSFER OWNERSHIP

其他 Db2 平台(Z/OS、i-series)可能有不同的限制,但原理相同。

要实现您的需要,您可以使用动态 SQL 而不是 Static-SQL(只要您了解其含义)。

换句话说,而不是写:

RENAME TABLE TMWIN.NSD_HOLIDAY_LOG_LIVE TO NSD_HOLIDAY_LOG_OLD;

您可以改用:

execute immediate('RENAME TABLE TMWIN.NSD_HOLIDAY_LOG_LIVE TO NSD_HOLIDAY_LOG_OLD' );

或同等学历。

也可以使用两种语句,一种是PREPARE and the other to EXECUTE , whichever suits the design. Refer to the documentation for execute immediate.

您的 Db2 版本在静态 compound-SQL(已编译)块(例如 DROP 或 CREATE 等)中不允许的其他语句也是如此。