Ошибка SQL0104 при создании функции в System i V7R1 - PullRequest
1 голос
/ 27 октября 2011

Я создаю функцию SQL в System i V7R1:

CREATE FUNCTION MYSCHEMA.GROUPDIBAS(v_code VARCHAR(50))
RETURNS VARCHAR(2048)
LANGUAGE SQL
BEGIN
    DECLARE str VARCHAR(2048);
    SET str = '';
    FOR row AS (
        SELECT 
            FIELD2
        FROM MYSCHEMA.DIBAS
        WHERE FIELD1 = v_code
    )
    DO
        SET str = 'Bubi'; --I removed many statements to make clear the problem doesn't come from them
    END FOR;
    RETURN str;
END
;

Я выполняю ее с помощью инструмента «Выполнить сценарий SQL», который является частью Навигатора iSeries V7R1.Он работает на другом сервере V7R1 (используя iSeries Navigator V5R4), но не на том, на котором я сейчас работаю.Сбой при этом сообщении:

SQL State: 42601
Vendor Code: -104
Message: [SQL0104] Token <END-OF-STATEMENT> was not valid. Valid tokens: ;.
  Cause . . . . . :   A syntax error was detected at token <END-OF-STATEMENT>.
  Token <END-OF-STATEMENT> is not a valid token.  A partial list of valid tokens is ;.
  This list assumes that the statement is correct up to the token.
  The error may be earlier in the statement, but the syntax of the statement appears to be valid up to this point.
  Recovery  . . . :   Do one or more of the following and try the request again:
  -- Verify the SQL statement in the area of the token <END-OF-STATEMENT>. Correct the statement.
     The error could be a missing comma or quotation mark, it could be a misspelled word, or it could be related to the order of clauses.
  -- If the error token is <END-OF-STATEMENT>, correct the SQL statement because it does not end with a valid clause.

Если я удаляю блок FOR, он работает.

Более того, если я выполняю инструкцию с эмулятором 5250, команда STRSQL, она работает.Так что похоже на ошибку в клиенте «Запуск сценария SQL».

Любая подсказка будет оценена!

Ответы [ 3 ]

4 голосов
/ 27 октября 2011

Проблема связана с оператором FOR . Анализатор запросов несовместим с тем, когда cursor-name CURSOR FOR является необязательным и когда он требуется, даже если в документации указано, что он не указан, генерируется уникальное имя курсора. Для SQL, отправленного с помощью служебной программы IBM Access Navigator Run Scripts, это требуется.

FOR syntax

Скобки также неверны, но иногда они принимаются (STRSQL, Navigator Run SQL Scripts), а иногда нет (DBVisualizer / JDBC).

TIL В зависимости от источника запроса должен работать другой анализатор запросов.

CREATE FUNCTION MYSCHEMA.GROUPDIBAS(v_code VARCHAR(50))
RETURNS VARCHAR(2048)
LANGUAGE SQL
BEGIN
    DECLARE str VARCHAR(2048);
    SET str = '';
    FOR row AS C1 CURSOR FOR
        SELECT 
            FIELD2
        FROM MYSCHEMA.DIBAS
        WHERE FIELD1 = v_code
    DO
        SET str = 'Bubi'; --I removed many statements to make clear the problem doesn't come from them
    END FOR;
    RETURN str;
END

query1

query2

1 голос
/ 14 июня 2016

В свойствах сеанса вашей IDE измените значение поля Statement Separator с ; на |, а затем снова подключите сеанс. затем используйте | вместо ;. таким образом, вы можете запустить ваше утверждение, процедуру или функцию.

usage example,
CREATE FUNCTION MYSCHEMA.GROUPDIBAS(v_code VARCHAR(50))
RETURNS VARCHAR(2048)
LANGUAGE SQL
BEGIN
    DECLARE str VARCHAR(2048);
    SET str = '';
    FOR row AS C1 CURSOR FOR
        SELECT 
            FIELD2
        FROM MYSCHEMA.DIBAS
        WHERE FIELD1 = v_code
    DO
        SET str = 'Bubi'; --I removed many statements to make clear the problem doesn't come from them
    END FOR;
    RETURN str;
END |
1 голос
/ 27 октября 2011

Учитывая тесты, проведенные @JamesA и мной, я боюсь, что проблема может быть в Program Temporary Fix (PTF), которого нет у этого сервера, а у других.В частности, при запуске команды WRKPTFGRP, я могу предположить, что она, вероятно, пропускает эту группу PTF:

PTF group  Level  Text
SF99701        5  DB2 FOR IBM I

К сожалению, я не могу попробовать установить ее сейчас: (.

...