2017-02-08 3 views
0

Мне было предложено создать определенную пользователем функцию в нашей среде Mainframe, которая проверяет строку поиска в более длинной строке. Единственный улов в том, что, если мы ищем пример для «AA» в «ABCAADAA», единственным действительным результатом является последний AA, потому что первый AA фактически разделен на CA и AD.UDF в DB2 11.0

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).

Первая ошибка, я получаю:

Что относится к линии я объявляю свою индексную переменную. Если я удалю точку с запятой, это говорит мне, что SET является незаконным там, потому что он ожидает точку с запятой. Я не могу придумать ничего другого, что мог бы попробовать (я много перепутал с кодом, но ошибки просто стали более странными). Я начал работать в этой области, находясь в колледже всего пару недель назад, и никто здесь не имеет реальных знаний об этом, поэтому я надеялся найти какую-то помощь здесь. Если вам что-то еще нужно, просто дайте мне знать!

Заранее спасибо.

+0

Возможный дубликат [неожиданный знак «CREATE TRIGGER] (http://stackoverflow.com/questions/13266700/an-unexpected-token-create -trigger) – mustaccio

ответ

1

Это может помочь вам: https://bytes.com/topic/db2/answers/754686-db2-udf-need-eliminate-if-statement

Он говорит, если оператор не имеет права на мэйнфрейме в 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& 
Смежные вопросы