【问题标题】:db2 - CASE WHEN or IF Statement in CREATE FUNCTIONdb2 - CREATE FUNCTION 中的 CASE WHEN 或 IF 语句
【发布时间】:2019-05-27 21:33:19
【问题描述】:

您好,我在管理 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"。莫格利切代币:“ END IF".. SQLCODE=-104, SQLSTATE=42601, DRIVER=4.14.113

当我使用 CASE WHEN 时的类似结果。

你知道问题出在哪里吗?

【问题讨论】:

标签: function if-statement db2 case


【解决方案1】:

在函数的 END 之后使用替代语句分隔符。

在函数内部,语句分隔符是分号(;)

但是 Db2 需要知道一个额外的分隔符来指示块的结尾。

对于 Db2 命令行(在 shell 脚本、批处理文件中),您可以使用“-td@”命令行选项并使用 @ 字符终止块。在包含您可以使用的函数的文件中:

--#SET TERMINATOR @
在功能块之前的任何地方,然后用@终止块

如果您使用 GUI 工具提交 DDL 或 SQL,每个 GUI 工具都有自己的方式来指定替代语句分隔符。查看设置和属性。在您的问题中完整描述您的工具集(哪些程序、哪些版本、哪些操作系统等)总是明智的。

【讨论】:

  • 谢谢!关于分隔符的提示让我很清楚。我让它在 dbeaver 和 liquibase 的 sql scipt 中运行。当我设置“忽略本机分隔符”时,它与 dbeaver 一起使用。在 Liquibase 中,您需要使用 标记。否则将无法正常工作。
猜你喜欢
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多