我试图修改一个正在工作的存储过程,并希望在该过程中添加一些条件逻辑。我创建了一个小的测试过程,只是为了尝试和理解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
1条答案
按热度按时间mbyulnm01#
这是一个常见问题。
首先确保代码在语法上有效:在您例子中,验证每个条件语句是否有自己的
END IF
,或者当您希望有一个条件语句时,使用ELSEIF
(而不是ELSE IF
)。接下来,验证复合语句分隔符。
当您有一个“块”(多个SQL语句)作为单个语句执行(也称为复合SQL编译)时,Db2客户端工具需要识别块的结尾。
SQL标准没有指定如何执行此操作,因此不同的RDBMS工具使用不同的技术。
许多使用Db2的人会使用@字符作为复合SQL块分隔符,而不是默认字符分号。分号仍然是分隔块内语句所必需的,但块也需要一些分隔符,因此如果使用@,则存储过程中的最后一个字符应该是该@字符。然后,选择包含此分隔符的块,并要求DBeaver将其作为单个复合语句执行。
DBeaver允许您通过其设置GUI进行此配置。
DBeaver中的示例导航(取决于您的DBeaver版本):
属性〉编辑器〉SQL编辑器〉SQL处理
当您进行这些更改时,您需要断开数据源的连接,并重新连接后这些更改才会生效。
如果您只使用Db2数据源,并且希望所有数据库都使用这些设置,则也可以在“全局设置”中进行这些更改。但是,同样,您可能需要断开连接并重新连接,这些设置才能生效。