UDF в DB2 11.0

Меня попросили создать пользовательскую функцию в нашей среде мэйнфреймов, которая проверяет строку поиска в более длинной строке. Единственный улов заключается в том, что если мы ищем, например, "AA" в "ABCAADAA", единственным действительным результатом является последний 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: ;    

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

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

2 ответа

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

Там написано, что оператор if не разрешен на мэйнфреймах в UDF? Таким образом, этот пользователь сгибает его к функции 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&
Другие вопросы по тегам