【问题标题】:DB2 function errorDB2 函数错误
【发布时间】:2014-09-05 15:46:28
【问题描述】:

下面的 DB2 函数有什么问题?

CREATE FUNCTION MIGRATION.determineToTaxService
(DIGI_NAAR_VLG CHAR, DIGI_VAN_VLG CHAR, NAARVLG CHAR)
RETURNS CHAR
BEGIN ATOMIC
    DECLARE returnValue CHAR;
    SET returnValue = '0';

    IF (DIGI_NAAR_VLG = '1') THEN
        SET returnValue = '1';

    ELSEIF (DIGI_VAN_VLG = '1') THEN
        SET returnValue = '1';

    ELSEIF (NAARVLG = '1') THEN
        SET returnValue = '1';
    END IF;

    RETURN returnValue;
END;

我收到此错误:

An unexpected token "CHAR" was found following " DECLARE returnValue".  Expected tokens may   include:  "END-OF-STATEMENT". SQL Code: -104, SQL State: 42601
Error occured in:
CREATE FUNCTION MIGRATION.determineToTaxService
   (DIGI_NAAR_VLG CHAR, DIGI_VAN_VLG CHAR,
    NAARVLG CHAR)
RETURNS CHAR
BEGIN ATOMIC
    DECLARE returnValue CHAR

我真的想不通。如果我删除 if 和 elsif 语句,它也不会运行,所以问题不应该存在。

【问题讨论】:

    标签: function db2


    【解决方案1】:

    终止字符错误:

    CREATE FUNCTION MIGRATION.determineToTaxService
    (DIGI_NAAR_VLG CHAR, DIGI_VAN_VLG CHAR, NAARVLG CHAR)
    RETURNS CHAR
    BEGIN ATOMIC
        DECLARE returnValue CHAR;
        SET returnValue = '0';
    
        IF (DIGI_NAAR_VLG = '1') THEN
            SET returnValue = '1';
    
        ELSEIF (DIGI_VAN_VLG = '1') THEN
            SET returnValue = '1';
    
        ELSEIF (NAARVLG = '1') THEN
            SET returnValue = '1';
        END IF;
    
        RETURN returnValue;
    END @
    

    你可以像这样从命令行调用它:

    db2 -td@ -vf test
    

    【讨论】:

    • 我知道,但是我必须迁移的数据库使用字符,所以我也必须使用它们。在参数和声明中使用 CHAR(1) 给了我:在“E returnValue CHAR(1”之后发现了一个意外的标记“)”。
    • 你是从命令行运行的吗?函数的终止字符是什么?因为它不能是';'
    • 我用的是松鼠。我试过@和;在“END”语句之后。
    • 我之前的回答是错误的。 DB2 接受没有大小的 CHAR(我不知道)。但是,您的问题是终止符字符。我已经在最后用 @ 进行了测试,它可以工作。
    • 您需要在松鼠中将语句终止符指定为@,我认为它在某个地方的会话中。不过,我会添加另一个解决方案作为可能的答案
    【解决方案2】:

    一个技巧是用如下注释结束行:

    CREATE FUNCTION MIGRATION.determineToTaxService
        (DIGI_NAAR_VLG CHAR, DIGI_VAN_VLG CHAR, NAARVLG CHAR)
    RETURNS CHAR
    BEGIN ATOMIC
        DECLARE returnValue CHAR; --
        SET returnValue = '0'; --
    
        IF (DIGI_NAAR_VLG = '1') THEN
            SET returnValue = '1'; --
    
        ELSEIF (DIGI_VAN_VLG = '1') THEN
            SET returnValue = '1'; --
    
        ELSEIF (NAARVLG = '1') THEN
            SET returnValue = '1'; --
        END IF; --
    
        RETURN returnValue; --
    END ;
    

    然后你可以继续使用;作为语句终止符

    您可能想要简化函数,例如:

    CREATE FUNCTION MIGRATION.determineToTaxService
        (DIGI_NAAR_VLG CHAR, DIGI_VAN_VLG CHAR, NAARVLG CHAR)
    RETURNS CHAR
    RETURN
        CASE WHEN DIGI_NAAR_VLG = '1' THEN '1'
             WHEN DIGI_VAN_VLG = '1' THEN '1'
             WHEN NAARVLG = '1' THEN '1'
             ELSE '0'
        END
    

    应该这样做

    【讨论】:

    • 第一个语句仍然给我An unexpected token "CHAR" was found following "DECLARE returnValue". Expected tokens may include: "END-OF-STATEMENT". 第二个函数有效,因为其中没有BEGIN 语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    相关资源
    最近更新 更多