DB2 11.0上的UDF

时间:2017-02-08 10:07:21

标签: sql db2 udf db2-zos

我被要求在我们的Mainframe环境中构建一个用户定义的函数,用于检查更长字符串中的搜索字符串。唯一的问题是,如果我们搜索一下AA' AA'在ABCAADAA'唯一有效的结果是最后一个AA,因为第一个AA实际上在CA和AD中分开。

CREATE FUNCTION F#CRE#WK (WK CHAR(02), WKATTR CHAR(10))
    RETURNS INTEGER 
    LANGUAGE SQL
    READS SQL DATA
BEGIN
    DECLARE INDEX INTEGER DEFAULT 1;
    WHILE (INDEX < 9) DO
        SET INDEX = LOCATE_IN_STRING(WKATTR, WK, INDEX);
        IF (MOD(INDEX, 2) <> 0) THEN
            RETURN 1;
        END IF;
    END WHILE;

    RETURN 0;
END;

当我使用Data Studio实现它时工作正常但是如果我直接将它放到主机上(我们使用的是Quick32770)我得到了一堆没有意义的错误一点都不我找不到任何有用的资源(当然,搜索整个IBM页面和Google)。

我得到的第一个错误是:

SQLCODE = -104, ERROR:  ILLEGAL SYMBOL "<END-OF-STATEMENT>". SOME  
SYMBOLS THAT MIGHT BE LEGAL ARE: ;    

这是指我宣布我的索引变量的行。如果我删除分号,它告诉我SET在那里是非法的,因为它期待分号。 我想不出任何我可以尝试的东西(我对代码进行了大量的讨论,但错误只是让它变得更加奇怪。)几周前我在大学期间就开始在这个领域工作,这里没有人真正了解这一点,所以我希望能在这里找到一些帮助。 如果您还需要其他任何东西,请告诉我!

提前致谢。

2 个答案:

答案 0 :(得分:1)

这可能对您有所帮助: https://bytes.com/topic/db2/answers/754686-db2-udf-need-eliminate-if-statement

它说UDF中的大型机上不允许使用if语句? 所以这个用户将它弯曲到一个CASE函数。

答案 1 :(得分:0)

为了解决此问题,您需要进入SPUFI设置并将TERMINATOR选项更改为分号以外的其他选项。如果我改为&amp;我的代码必须如下所示:

CREATE FUNCTION F#CRE#WK (WK CHAR(02), WKATTR CHAR(10))
RETURNS INTEGER 
LANGUAGE SQL
READS SQL DATA
BEGIN
    DECLARE INDEX INTEGER DEFAULT 1;
    WHILE (INDEX < 9) DO
        SET INDEX = LOCATE_IN_STRING(WKATTR, WK, INDEX);
        IF (MOD(INDEX, 2) <> 0) THEN
            RETURN 1;
        END IF;
    END WHILE;
    RETURN 0;
END&