function - db2 - CREATE FUNCTION 中的 CASE WHEN 或 IF 语句
问题描述
嗨,我在 DB2 中的 CREATE FUNCTION 调用中管理 CASE WHEN 或 IF 语句时遇到问题我尝试了以下语句:
CREATE OR REPLACE FUNCTION NAECHSTES_DATUM(PARAM1 CHAR(6), PARAM2 DATE)
RETURNS DATE
LANGUAGE SQL
BEGIN
DECLARE BASEDATE DATE;
DECLARE THATDATE DATE;
SET BASEDATE = TO_DATE(CONCAT(PARAM1,CAST(YEAR(PARAM2) AS CHAR(4))),'DD.MM.YYYY');
IF (BASEDATE >= PARAM2)
THEN SET THATDATE = BASEDATE;
ELSE SET THATDATE = BASEDATE + 1 YEAR;
END IF;
RETURN THATDATE;
END
我收到这个错误
[-104] Auf "+ 1 YEAR" folgte das unerwartete Token "END-OF-STATEMENT"。Mögliche 令牌:“ END IF”.. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.14.113
当我使用 CASE WHEN 时,结果类似。
你知道问题可能出在哪里吗?
解决方案
在函数的 END 之后使用替代语句分隔符。
在函数内部,语句分隔符是分号 (;)
但是 Db2 需要知道一个额外的分隔符来指示块的结尾。
对于 Db2 命令行(在 shell 脚本、批处理文件中),您可以使用“-td@”命令行选项并使用 @ 字符终止块。在包含您可以使用的函数的文件中:
--#SET TERMINATOR @
功能块之前的任何位置,然后用 @ 终止块
如果您使用 GUI 工具提交 DDL 或 SQL,则每个 GUI 工具都有自己的方式来指定替代语句分隔符。查看设置和属性。在您的问题中完整描述您的工具集(哪些程序、哪些版本、哪些操作系统等)总是明智的。
推荐阅读
- selenium - 我们可以在 Allure 报告中有一个比较图(套件明智)吗
- jenkins-pipeline - 如何并行运行阶段但在脚本的“较低级别”上选择代理?
- python - 如何让车辆检测模型更快?
- firebase - Vue.js / Quasar 移动应用程序推送通知运行带有电容器和 Firebase 的 Service Worker
- loops - 使用自定义范围创建 for if 循环
- android - Android Fused Location Provider 有时会给出无效的坐标
- java - Popup 中的导航问题以及如何使用 setLocationRelativeto()
- list - 键值联合函数 ocaml
- javascript - Javascript Code Words Only After Second Click
- laravel - 如何更正 Laravel 中的 public_path()?