2

SQL で宣言されたカーソルを使用して、フィールド (コード) 内の次の文字をフェッチする while ループを作成しようとしています。目標は、ループで次の一致する文字を取得することです。次に、ループの最後に結果を返します。目標は、完全に一致するものがない場合に、コードに部分的に一致させることです。これまでカーソルを使用したことがないので、フェッチとカーソルの使用についてできる限り多くのことを学ぼうとしています。

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;
4

1 に答える 1

9

うわー...ここで多くの間違いがあります.一目で...

  1. 間違った場所でカーソルを宣言しようとしています。
  2. %EOF()RPG レコード レベルのアクセスで動作します。SQLCODE または SQLSTATE を確認する必要があります。
  3. FETCH OPENすべての 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セクションを読むことをお勧めします。

于 2016-05-16T21:13:07.760 に答える