2016-05-16 20 views
1

私のコードに何が問題なのかよく分かりませんが、SQLで宣言されているカーソルでフィールド(コード)の次の文字をフェッチするwhileループを作ろうとしています。目標は、ループで次の一致する文字を取得することです。次に、ループの最後に結果を戻したいと思います。目標は、完全一致がない場合、コードと部分的に一致させることです。私は前にカーソルを使ったことがないので、フェッチとカーソルを使ってできる限り学びたいと思っています。SQL FETCH、カーソルとRPG

EXEC SQL 
    SELECT field FROM file 
    WHERE field = :code 

    UNION 

    DECLARE UserInput CURSOR FOR 
    SELECT field FROM file 
    WHERE field LIKE '%' || :code || '%' 
    ORDER BY field ASC 

    OPEN UserInput 
    FETCH NEXT FROM UserInput 
    BEGIN 
     DO WHILE <> %EOF 
      FETCH NEXT FROM UserInput 
    END 
    CLOSE UserInput 
    DEALLOCATE UserInput; 

答えて

5

うわー...たくさんここで間違って...一目で ...

  1. あなたは間違った場所にカーソルを宣言しようとしています。
  2. %EOF()あなたが SQLCODEをチェックする必要がRPGレコードレベルのアクセス権を持つ作品、またはSQLSTATE
  3. FETCHOPENは、すべてのSQL文ですEXEC SQL
  4. DEALLOCATEにする必要が
  5. を必要とされていないFETCHする必要があります

    :RPG変数

にカーソルから行は、このコードを見てみましょう

EXEC SQL            
    DECLARE UserInput CURSOR FOR      
    SELECT field FROM file       
    WHERE field = :code        
    UNION           
    SELECT field FROM file       
    WHERE field LIKE '%' || :code || '%'   
    ORDER BY field ASC;        
EXEC SQL            
    OPEN UserInput;         
--really should check SQLSTATE here too!    

EXEC SQL            
    FETCH NEXT FROM UserInput INTO :MyRpgVar;   

Dow SQLSTATE = '00000';        
    --note 00000 = no errors or warning    
    --  02000 = no data       
    <do somthing?>         
    EXEC SQL           
     FETCH NEXT FROM UserInput INTO :MyRpgVar;  
ENDDO;            

EXEC SQL            
    CLOSE UserInput; 

埋め込みSQLプログラミングRPGLEセクションを読むことをお勧めします。

+0

ありがとう、これは私がそれをはるかによく理解するのに役立ちます! –

+1

もう一つ、 'CODE'と' FIELD'が固定長文字フィールドであると仮定すると、 '% '||トリム(:コード)|| '%' '。 – Charles

+1

バリアント文字、_bar_記号 "|"を放棄して、||演算子としてCONCATを演算子として使用します。 – CRPence