RPG と SQL のあれこれ (カーソルの定義位置とコンパイルオプション)

こんどはこちらをさらに書き換えてみました。

カーソルの定義位置

SQL RPG などの場合、カーソルの定義はカーソルの操作より前に存在している必要がありましたが、今はそんなことはありません。
このことによって、例えば以下のようにサブプロシージャの中にカーソルの定義を置くことができるようになっています。

D CusrSetup       PR                                                               
 *                                                                                 
 /Free                                                                             
        CusrSetup() ;                  

 *                                                                                    
P CusrSetup       B                                                                   
D                 PI                  
 /Free          
        EXEC SQL    DECLARE CustCSR  Cursor For                                       
                      SELECT * FROM QIWS/QCUSTCDT ;       

コンパイルオプション

コンパイルオプションを使用して、ソースの内容をコントロールすることができます。
たとえば、テスト用のテーブルか本番用のテーブルかをコンパイルオプションで指定することができます。

以下のように定義しておいて、

 /Free                                                                                
  /IF DEFINED(USE_TEST_TABLE)                                                         
        EXEC SQL    DECLARE CustCSR  Cursor For                                       
                      SELECT * FROM SQLTEST/QCUSTCDT ;                                
  /ELSE                                                                               
        EXEC SQL    DECLARE CustCSR  Cursor For                                       
                      SELECT * FROM QIWS/QCUSTCDT ;                                   
  /ENDIF                                                                              
 /End-Free     

RPGPPOPT パラメータに *LVL1 か *LVL2 (デフォルトは *NONE) を指定した上で COMPILEOPT パラメータに DEFINE(USE_TEST_TABLE) という指定をすると SQLTEST ライブラリーの中の QCUSTCDT テーブルが使用されるようになります。

CRTSQLRPGI OBJ(SQLTEST/SQLTEST2) SRCFILE(SQLTEST/QRPGLESRC) COMMIT(*NONE) RPGPPOPT(*LVL1) DBGVIEW(*SOURCE) COMPILEOPT('DFTACTGRP(*NO) DEFINE(USE_TEST_TABLE)')

ヘルプを引用しておきます。(V5R4)

RPG プリプロセッサ・オプション (RPGPPOPT) −ヘルプ

SQL プリコンパイルを実行する前に, RPG コンパイラーを呼び出してソース・メンバーを事前処理するかどうかを指定します。 SQL ソース・メンバーの事前処理によって, SQL プリコンパイルの前に,一部のコンパイラー・ディレクティブを処理することができます。 事前処理されたソースは, QTEMP のファイル QSQLPRE に入れられます。このソースが SQL プリコンパイルに使用されます。

*NONE
コンパイラーは事前処理に呼び出されません。

*LVL1
コンパイラーが事前処理に呼び出され, /COPY を展開し,/INCLUDE ディレクティブ以外の条件付きコンパイル・ディレクティブを処理します。

*LVL2
コンパイラーが事前処理に呼び出され, /COPY および/INCLUDE を展開し,条件付きコンパイル・ディレクティブを処理します。

SQLTEST ライブラリーの QCUSTCDT テーブルの LSTNAM カラムの内容はすべて CAPS にしてあります。
実行してみると、ちゃんとそちらのテーブルを参照していることが確認できました。

本番用にするには、単純に DEFINE(... の指定をなくしてしまえばいいわけです。

連続して実行しているので結果が続いてしまっていますが、CAPS ではない LSTNAM カラムの内容が表示されています。こちらが QIWS ライブラリーの中の QCUSTCDT テーブルのものになっています。

また、ここで DFTACTGRP(*NO) や ACTGRP(*CALLER) などの CRTSQLRPGI コマンドには存在しないオプションを指定することもできます。ただ、この指定は構文チェックの対象になりませんので、スペルミスには気をつけてください。


こちらが全文になります。

D CustRow       E DS                  ExtName(QCUSTCDT)                            
D                                     Qualified                                    
D                                     DIM(10)                                      
 *                                                                                 
D LastName      E                     EXTFLD(LstNam)                               
 *                                                                                 
D i               S              2  0                                              
 *                                                                                 
D CusrSetup       PR                                                               
 *                                                                                 
 /Free                                                                             
        CusrSetup() ;                                                              
                                                                                   
        EXEC SQL    OPEN CustCSR ;                                                 
                                                                                   
        EXEC SQL    FETCH CustCSR FOR 10 ROWS                                      
                      INTO :CustRow ;                                              
                                                                                   
        for i = 1 to %elem(CustRow) ;                                              
          DSPLY CustRow(i).LastName ;                                                 
        Endfor ;                                                                      
                                                                                      
        EXEC SQL    CLOSE CustCSR ;                                                   
                                                                                      
        *inlr = *on ;                                                                 
        return ;                                                                      
 /End-Free                                                                            
 *                                                                                    
P CusrSetup       B                                                                   
D                 PI                                                                  
 /Free                                                                                
  /IF DEFINED(USE_TEST_TABLE)                                                         
        EXEC SQL    DECLARE CustCSR  Cursor For                                       
                      SELECT * FROM SQLTEST/QCUSTCDT ;                                
  /ELSE                                                                               
        EXEC SQL    DECLARE CustCSR  Cursor For                                       
                      SELECT * FROM QIWS/QCUSTCDT ;                                   
  /ENDIF                                                                              
 /End-Free                                                                            
P CusrSetup       E

[Top Pageに戻る]

Ads by TOK2