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&