首页 > 解决方案 > DB2 存储过程 IF/ELSE —— 我缺少什么?

问题描述

尝试在工作中修改存储过程并希望在过程中添加一些条件逻辑。我创建了一个小型测试程序,只是为了尝试理解 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

标签: sqlstored-proceduresdb2

解决方案


这是一个经常被问到的问题。

首先确保您的代码在语法上有效:在您的情况下,验证每个条件语句都有自己的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 数据源并希望对所有数据库进行这些设置,您还可以在“全局设置”中进行这些更改。但同样,您可能需要在设置生效之前断开连接并重新连接。


推荐阅读