1

System i V7R1 で SQL 関数を作成しています。

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
;

iSeries ナビゲーター V7R1 の一部である「SQL スクリプトの実行」ツールを使用して実行します。別の 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 でステートメントを実行すると、機能します。したがって、「Run SQL script」クライアントのバグのようです。

どんなヒントでも大歓迎です!

4

3 に答える 3

4

問題はFOR ステートメントにあります。cursor-name CURSOR FOR一意のカーソル名が指定されていない場合は生成されるとドキュメントに記載されていても、クエリ アナライザーはオプションである場合と必須である場合で一貫性がありません。IBM Access Navigator Run Scripts ユーティリティを介して送信された SQL には、これが必要です。

FOR 構文

括弧も正しくありませんが、受け入れられる場合 (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

クエリ1

クエリ2

于 2011-10-27T13:45:52.990 に答える
1

@JamesA と私が行ったテストを考えると、このサーバーにはなく、他のサーバーにはあるプログラム一時修正(PTF) に問題があるのではないかと心配しています。具体的には、WRKPTFGRPコマンドを実行すると、おそらくこの PTF グループが欠落していると推測できます。

PTF group  Level  Text
SF99701        5  DB2 FOR IBM I

残念ながら、今はインストールを試すことができません:(。

于 2011-10-27T15:24:47.460 に答える
1

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 |
于 2016-06-14T14:19:46.120 に答える