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页面和谷歌)。

我得到的第一个错误是:

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&

相关内容

  • 没有找到相关文章

最新更新