繁体   English   中英

DB2 11.0上的UDF

[英]UDF on DB2 11.0

我被要求在我们的大型机环境中构建用户定义的函数,该函数检查较长字符串中的搜索字符串。 唯一的问题是,如果我们在“ ABCAADAA”中搜索“ AA”,则唯一有效的结果是最后一个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在那儿是非法的,因为它期望使用分号。 我想不出什么我可以尝试的方法(我经常弄乱代码,但是错误只会变得越来越怪异。)。 几周前我刚上大学时就开始在这个领域工作,这里没有人对此有实际了解,所以我希望在这里找到一些帮助。 如果您还有其他需要,请告诉我!

提前致谢。

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

它说在UDF的大型机上不允许使用if语句? 因此,该用户可以将其转向CASE功能。

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

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&

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM