2017-02-08 53 views
0

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

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

我得到第一个错误是:

这是指我说出我的指标变量的行。如果我删除了分号,它告诉我该SET在那里是非法的,因为它期待分号。 我想不出任何我可以尝试的东西(我搞砸了很多代码,但错误却越来越奇怪)。几个星期前我在大学时开始在这个领域工作,没有人在这里有实际的知识,所以我希望能在这里找到一些帮助。 如果您还有其他需要的东西,请告诉我!

在此先感谢。

+0

[意外的标记“CREATE TRIGGER](可能的重复http://stackoverflow.com/questions/13266700/an-unexpected-token-create - 触发器) – mustaccio

回答

1

这可以帮助你: https://bytes.com/topic/db2/answers/754686-db2-udf-need-eliminate-if-statement

它说的if语句是不允许在UDF主机? 因此,此用户将其弯曲到CASE功能。

+0

谢谢你!我将无法测试它,直到星期一,但我会确保报告回来。我猜(我的团队也是)这是一个大型机安装的问题,但我们不能改变它,因为我们不知道我们需要改变什么。 – Crosswind

0

为了解决这个问题,您需要进入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&