【问题标题】:DB2 stored procedure gave syntax errorsDB2 存储过程给出了语法错误
【发布时间】:2019-02-02 23:03:46
【问题描述】:

我正在为 db2 创建一个存储过程。但它给出了一个错误,说

“SQL 错误 [42601]:发现意外的标记“END-OF-STATEMENT” 跟随“SS_TOKEN_BAK”。预期的标记可能包括:“END IF”.. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.23.42"。

以下是我的存储过程。

CREATE OR REPLACE PROCEDURE TOKEN_CLEANUP_SP

BEGIN

DECLARE batchSize INTEGER;

-- ------------------------------------------
-- CONFIGURABLE ATTRIBUTES
-- ------------------------------------------
SET batchSize = 10000;      -- SET BATCH SIZE FOR AVOID TABLE LOCKS    [DEFAULT : 10000]

-- ------------------------------------------------------
-- BACKUP IDN_OAUTH2_ACCESS_TOKEN TABLE
-- ------------------------------------------------------
IF EXISTS (SELECT TABLE_NAME FROM TABLES WHERE TABLE_NAME = 'IDN_OAUTH2_ACCESS_TOKEN_BAK')
THEN
    DROP TABLE IDN_OAUTH2_ACCESS_TOKEN_BAK;
END IF;     

END/

有没有人遇到过这种问题。对此的任何帮助将不胜感激。

【问题讨论】:

    标签: sql stored-procedures db2


    【解决方案1】:

    验证您是否为提交“CREATE OR REPLACE”过程的任何工具正确配置了语句结束分隔符。不同的工具有不同的方式来配置块终止符(或者称为语句结束分隔符)。对于命令行脚本,在文件开头使用--#SET TERMINATOR /,其他方式也可以。

    您的代码示例显示 / 作为块终止符,因此您可能希望使用该字符作为块分隔符。分号终止块内的语句。

    另外,您应该看到,如果在编译时指定的表不存在于隐含架构中,您的代码将无法编译,因为您使用的是静态 SQL。您可能希望使用动态 SQL 代替 drop table 语句(搜索“EXECUTE IMMEDIATE”示例)。

    【讨论】:

    • 感谢您的快速回复。我已经通过dbeaver执行了上面的存储过程,并且已经将语句分隔符设置为“/”。
    • 正确配置后,在 DBeaver 和命令行中对我来说效果很好。要么你做错了,要么你的代码示例不是你正在运行的。我在 DBeaver 和命令行中使用 @ 作为语句分隔符。 DBeaver 还允许使用空白行分隔符选项,该选项也可以使用,但对脚本不友好,您需要自动化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 2018-05-12
    相关资源
    最近更新 更多