DB2存储过程IF/ELSE --我遗漏了什么?

ifsvaxew  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(552)

我试图修改一个正在工作的存储过程,并希望在该过程中添加一些条件逻辑。我创建了一个小的测试过程,只是为了尝试和理解IF/ELSE逻辑,但我一直受到DBeaver(我的SQL UI)的指责。我几乎是直接从IBM文档网站上获得了这个示例。有人能告诉我我在这里遗漏了什么吗:

CREATE PROCEDURE IFTEST(IN rating INTEGER, OUT res VARCHAR(1))
  LANGUAGE  SQL
  BEGIN
    IF rating = 1 THEN
        SET res = '2';
   -- ELSE IF rating = 2 THEN
    --  SET res = 3;
    ELSE
        SET res = '4';
    END IF;
  END

它一直在告诉我:

SQL Error [42601]: An unexpected token "END-OF-STATEMENT" was found following "s = '4'".  Expected tokens may include:  " 
    END IF".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.26.14
mbyulnm0

mbyulnm01#

这是一个常见问题。
首先确保代码在语法上有效:在您例子中,验证每个条件语句是否有自己的END IF,或者当您希望有一个条件语句时,使用ELSEIF(而不是ELSE IF)。
接下来,验证复合语句分隔符。
当您有一个“块”(多个SQL语句)作为单个语句执行(也称为复合SQL编译)时,Db2客户端工具需要识别块的结尾。
SQL标准没有指定如何执行此操作,因此不同的RDBMS工具使用不同的技术。
许多使用Db2的人会使用@字符作为复合SQL块分隔符,而不是默认字符分号。分号仍然是分隔块内语句所必需的,但块也需要一些分隔符,因此如果使用@,则存储过程中的最后一个字符应该是该@字符。然后,选择包含此分隔符的块,并要求DBeaver将其作为单个复合语句执行。
DBeaver允许您通过其设置GUI进行此配置。
DBeaver中的示例导航(取决于您的DBeaver版本):
属性〉编辑器〉SQL编辑器〉SQL处理

Statements delimiter:  @
Ignore native delimiter (tick)
Blank line is statement delimiter (only use this if you code accordingly)
Remove trailing query delimiter (tick)

当您进行这些更改时,您需要断开数据源的连接,并重新连接后这些更改才会生效。
如果您只使用Db2数据源,并且希望所有数据库都使用这些设置,则也可以在“全局设置”中进行这些更改。但是,同样,您可能需要断开连接并重新连接,这些设置才能生效。

相关问题