简体   繁体   English

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

[英]Getting error when trying to Rename multiple tables in SPROC in DB2

I've created a DB2 sql script that populates a static table and then does a rename to swap out the live table with the newly updated one.我创建了一个 DB2 sql 脚本,它填充一个静态表,然后重命名以用新更新的表换出实时表。 Its a fairly large SQL script so I'm only including the areas that Im having a an error on.它是一个相当大的 SQL 脚本,所以我只包括我有错误的区域。

I'm getting the error: "[IBM][CLI Driver][DB2/NT64] SQL0104N An unexpected token "RENAME" was found following "D_HOLIDAY_LOG_OLD;我收到错误消息:“[IBM][CLI 驱动程序][DB2/NT64] SQL0104N 在“D_HOLIDAY_LOG_OLD; ". Expected tokens may include: "TRUNCATE". LINE NUMBER=382. SQLSTATE=42601". ”。预期的标记可能包括:“TRUNCATE”。行号=382。SQLSTATE=42601”。

I suspect, its a syntax issue with the RENAME commands.我怀疑,这是 RENAME 命令的语法问题。 If I need to add the whole query, I can.如果我需要添加整个查询,我可以。 Thanks in advance提前致谢

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@

This is frequently asked.这是经常被问到的。

As you are using static SQL in an SQL PL stored procedure, you must follow the documented rules for blocks of Compound SQL (Compiled) statements.当您在 SQL PL 存储过程中使用静态 SQL 时,您必须遵循复合 SQL(编译)语句块的记录规则。

On of those rules is that static SQL has a restricted set of statements that can appear in such a block of code.这些规则之一是静态 SQL 有一组受限制的语句,可以出现在这样的代码块中。

For example, with current versions of Db2-LUW, you cannot use any of the following statically (including rename 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-LUW 的当前版本,您不能静态使用以下任何内容(包括重命名表): 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

Other Db2 platforms (Z/OS, i-series) might have different restrictions but the same principle.其他 Db2 平台(Z/OS、i 系列)可能有不同的限制,但原理相同。

To achieve what you need you can use dynamic SQL instead of Static-SQL (as long as you understand the implications).为了实现您的需要,您可以使用动态 SQL 而不是静态 SQL(只要您了解其含义)。

In other words, instead of writing:换句话说,而不是写:

RENAME TABLE TMWIN.NSD_HOLIDAY_LOG_LIVE TO NSD_HOLIDAY_LOG_OLD;

you could instead use:你可以改用:

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

or equivalent.或同等学历。

You can also use two statements, one to PREPARE and the other to EXECUTE , whichever suits the design.您还可以使用两个语句,一个用于PREPARE ,另一个用于EXECUTE ,以适合设计的为准。 Refer to the documentation for execute immediate .请参阅立即执行的文档。

The same is true for other statements that your version of Db2 disallows in static compound-SQL (compiled) blocks (for example, DROP, or CREATE etc.).对于您的 Db2 版本在静态复合 SQL(已编译)块(例如,DROP 或 CREATE 等)中不允许的其他语句也是如此。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM