尝试在 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 等)中不允许的其他语句也是如此。
我创建了一个 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 等)中不允许的其他语句也是如此。