2011-10-27 6 views
1

私はV7R1のSystem i上のSQL関数を作成していますシステム内の関数を作成するとき:エラーSQL0104私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 
; 

は、私は、iSeriesナビゲーターの一部である "ファイル名を指定して実行SQLスクリプト" ツール、とそれを実行しますV7R1。 これは、別のV7R1サーバー(iSeriesナビゲーターV5R4を使用)上で動作しますが、現在作業しているV7R1サーバーでは動作しません。これは、このメッセージで失敗します。

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"クライアントのバグのようです。

ご了承ください。

答えて

1

、私は、このサーバがhasnという問題がプログラム一時修正(PTF)にあることができる恐れそれ以外のものは持っている。具体的には、WRKPTFGRPコマンドを実行している、私はそれはおそらく、このPTFグループをミス推測することができます。

PTF group Level Text 
SF99701  5 DB2 FOR IBM I 

残念ながら、私は今それをインストールしてみてくださいすることはできません:(あなたのIDEのセッションのプロパティで

+0

私がテストしたV7R1システムは、レベル4のSF99701を持っています。 – jamesallman

4

問題はFOR statementです。クエリーアナライザは、cursor-name CURSOR FORがオプションである場合と、ドキュメンテーションが指定されていない場合に固有のカーソル名が生成されているにもかかわらず、必要な場合に不一致です。 IBM Access Navigator Run Scriptsユーティリティを使用して提出されたSQLには、それが必要です。

FOR syntax

カッコ

も間違っていますが、時には彼らは(STRSQL、ナビゲーターの実行SQLスクリプト)受け入れられ、時には彼らは(DbVisualizerの/ JDBC)ではありません。

TILクエリのソースに応じて異なるクエリアナライザが実行されている必要があります。 @JamesAと私が行った試験を考える

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

+0

あなたの偉大な答えが私にこの問題を解決する夢を与えました:)しかし、それは私に同じ問題をもたらします。私はまた、編集者はエラーポイントが最後のセミコロンであることを示していることを指摘します。ありがとう! – bluish

+0

"FOR C" FOR "ステートメントに" C1 CURSOR FOR "を追加するまで、SQL0104エラーも受け取りました。私はOS/400 V7R1とIBM Access V7R1でテストしました。 – jamesallman

1

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 | 
+0

+1。 1年以上経過していて、この回答はストアドプロシージャを作成しようとした2日後に私のために働いた –

関連する問題