【问题标题】:Problem trying to execute a while loop with insert in db2尝试在 db2 中使用插入执行 while 循环时出现问题
【发布时间】:2023-03-07 11:44:01
【问题描述】:

我正在尝试向表中插入条目:

CREATE TABLE MYTABLE (ID INT);

BEGIN
DECLARE CNT INT DEFAULT 0;
WHILE CNT<100 DO
INSERT INTO MYTABLE(ID) VALUES(CNT);
SET CNT = CNT + 1;
END WHILE;
END

循环有什么问题?它不会运行。它显示的错误是:

错误:在“re cnt int default 0”之后发现了一个意外的标记“End of starement”。预期的标记可能包括“psm_semicolon>” sqlcode=-104 sqlstate=42601, driver=3.67.27 错误发生在: 开始 DECLARE CNT INT DEFAULT 0

【问题讨论】:

    标签: while-loop db2 sql-insert


    【解决方案1】:

    这是一个常见问题,您可以通过搜索找到它。

    您需要告诉您用于提交 SQL 语句的任何工具有一个替代语句终止符(也称为语句分隔符),然后在 SQL 块的末尾使用该替代语句终止符,以及任何独立的非-复合语句。

    很多人用@来表示块的结束,不同的工具往往建议不同的字符。

    对于squirrel sql,某些版本在'New Session Properties'的SQL选项卡上有一个“Statement Separator”属性,您可以将其设置为@,这在您打开下一次时生效会议。然后,您的代码将在 create table 语句的末尾加上 @,在块的末尾加上一次 @(如果您有两个语句,其中一个是复合块)。如果您有两个以上的语句,则每个复合块在块的末尾都需要自己的 @ 终止符,并且每个独立语句(非复合)都需要自己的 @。

    背景是当你在 Db2 中有复合(多语句)SQL 块时,分号是语句块inside 的终止符,但是你需要一个不同的终止符来表示整个街区的尽头。没有那个终止符,你会得到一个 SQL 异常。

    不同的工具有不同的方式来指定替代语句终止符。

    您的问题未提及您用于提交 SQL 的工具或您的 Db2 服务器平台,这有时可能是相关的。

    如果您使用 Db2 命令行处理器(在 Windows、Linux/Unix 上的 shell 命令行)提交 SQL,那么您可以在 db2 命令行 (-td@) 上指定替代语句终止符,或 在运行中 在包含 SQL 语句的文件中(只要该文件由 db2 CLP 提交)通过具有读取为 --#SET TERMINATOR @ 的行。您可以在发送到 CLP 的文件中尽可能频繁地使用它,如有必要,每个都有不同的终止符,并且 if 仅影响该行之后的后续语句,直到指定下一个终止​​符。这种方法通常不适用于squirrel sql等基于java的工具,因此请使用语句分隔符属性。

    【讨论】:

    • 我在 linux 中使用 squirrel SQL 来运行它。那么,我在 END 之后使用 @ 还是用 @ 符号替换每个分号?我花了一些时间寻找解决方案,但无法。也许我没有找到正确的东西。
    • 谢谢。 “语句分隔符”属性运行良好。
    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    相关资源
    最近更新 更多