【问题标题】:DB2 Stored Procedure IF/ELSE -- What am I missing?DB2 存储过程 IF/ELSE —— 我错过了什么?
【发布时间】:2021-10-31 03:16:30
【问题描述】:

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

【问题讨论】:

  • 将 Dbeaver 中的语句分隔符配置为不同于默认分号的东西,很多人使用 @ 代替。然后在块的末尾(即在最后的 END 之后)使用选择的字符。这是一个常见问题解答,所以做你的研究,因为很多人以前问过同样的问题。
  • 根据我的经验,DBeaver 在许多使用 db2 jdbc 连接器的情况下表现异常。有时我认为 jdbc 本身存在一些问题。我可以举出许多可能被视为错误的示例。
  • 谢谢@mao。作为记录,我在发布之前一直在网上搜索解决方案。更改了分隔符,现在我得到了:SQL 错误 [42601]:在“END”之后发现了意外的标记“END-OF-STATEMENT”。预期的标记可能包括:“JOIN ”.. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.26.14

标签: sql stored-procedures db2


【解决方案1】:

这是一个常见问题。

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

【讨论】:

  • 感谢您的回复。我做了你上面建议的所有更改,但我仍然看到错误。 DBeaver 中是否有其他设置可能导致此问题?新过程: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 @ 错误:SQL 错误 [42601]:在“'”之后发现了意外的标记“END”。预期的标记可能包括:“END IF”.. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.26.14
  • 我的错。是的,我在 ELSE 和 IF 之间使用了粗手指,这导致了失败。现在它执行正常。我认为我的主要问题只是 DBeaver 分隔符问题。再次感谢!
  • @MushroomHunter 请将答案标记为已接受。
猜你喜欢
  • 2019-09-07
  • 2010-12-13
  • 1970-01-01
  • 2018-05-23
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
相关资源
最近更新 更多