sql - 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
解决方案
这是一个经常被问到的问题。
首先确保您的代码在语法上有效:在您的情况下,验证每个条件语句都有自己的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 数据源并希望对所有数据库进行这些设置,您还可以在“全局设置”中进行这些更改。但同样,您可能需要在设置生效之前断开连接并重新连接。
推荐阅读
- jquery - 如何将一组视频容器中的每个按钮与其视频相关联?
- hibernate - 使用 Hibernate 3.6.10 的 CriteriaQuery
- for-loop - SIMULINK:对工作区中数组的每个元素重复子系统并重新组合信号
- javascript - 尝试使用第一个数组的子集“交叉”两个数组并在可能的情况下保持第二个数组的顺序
- sql - 通过使用 DECODE 函数,将日期更改为任何字符串?
- c++ - 从具有默认值的部分指定模板类继承时出现 SWIG 错误,前向声明没有默认值
- node.js - 制作我自己的 npm 包,不断收到 TypeScript 错误
- angular - 从数据源到查看@angular/elements 的目标数据绑定的一种方式
- php - 如何使用 CI 访问 tpl 文件下的徽标或图像?
- reactjs - React.memo 的性能比 React.PureComponent 差