【问题标题】:UDF on DB2 11.0DB2 11.0 上的 UDF
【发布时间】:2017-02-08 10:07:20
【问题描述】:

我被要求在我们的 Mainframe 环境中构建一个用户定义的函数,用于检查较长字符串中的搜索字符串。唯一的问题是,如果我们在“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 在那里是非法的,因为它需要一个分号。 我想不出还有什么可以尝试的(我经常弄乱代码,但错误越来越奇怪。)。几周前我在上大学的时候就开始在这个领域工作,这里没有人对此有真正的了解,所以我希望在这里能找到一些帮助。 如果您还有其他需要,请告诉我!

提前致谢。

【问题讨论】:

标签: sql db2 udf db2-zos


【解决方案1】:

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

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

【讨论】:

  • 谢谢!我要到星期一才能测试它,但我会确保报告回来。我的猜测(以及我的团队也是)是大型机设置存在问题,但我们无法更改它,因为我们不知道需要更改什么。
【解决方案2】:

要解决此问题,您需要进入 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&

【讨论】:

    猜你喜欢
    • 2016-12-05
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多