DFU, Query, SQL

37. CRTSQLRPGI の正しい利用

SQLパッケージ・プログラムの開発において CRTSQLRPGIコマンドは

多くの開発者に利用されているはずであるが、正しい利用方法としての注意点を 2つ紹介する。

ひとつは「活動化グループ」についてであり、もうひとつは「生成重大度レベル」についてである。

 

(1) 活動化グループについて

CRTSQLRPGIコマンドは ILE-RPG の SQLバインドのコンパイラーであるにもかかわらず

「活動化グループ」についての指定がない。

これは IBM のミスであろう。

ILE-RPG のコンパイルであるならば活動化グループも指定できるようにすることは必須であるはずである。

さらに IBM は、もうひとつミスを犯している。

CRTSQLRPGI の活動化グループを *DFTACTGRP にしてしまっていることである。

*DFTACTGRP とは通常のジョブに初めから与えられている QILE のことであり

これはジョブが終了しない限り、クローズされることはない。

したがって、CRTSQLRPGI*PGM を作成すると、活動化グループは

*DFTACTGRP

で生成されてしまうので、CRTSQLRPGI で作成された *PGMオブジェクトは

ジョブ上で 2回目以降に呼ばれたときには変数値が残ったままかの予想できない動作になってしまう。

我々が一般的に期待する動作を行う活動化グループは

*DFTACTGRP ではなく *NEW である

ので、これは誤動作の原因になることは間違いない。

米国IBMユーザーでは IBM の意向とは異なり、一般的には *NEW として作成することが多い。

そこで *NEW として SQL RPG をコンパイルするにはどのようにすればよいだろうか ?

*NEW として SQL RPG をコンパイルするにはCRTSQLRPGI*MODULE

まず作成しておいてから次に CRTPGM*NEW を指定して作成する

ことである。

 

具体的には、

【例】

1. モジュールの作成

CRTSQLRPGI OBJ(QTEMP/P1) SRCFILE(QTRSRC/QRPGLESRC) OBJTYPE(*MODULE)

 

2. *PGM の作成

 

CRTPGM PGM(QTROBJ/P1) MODULE(QTEMP/P1) ACTGRP(*NEW) AUT(*ALL)

(2) 生成重大度レベルについて

CRTSQLRPGIコマンドによるコンパイルのもうひとつの問題点は OS/400リリース別に

エラー重大度が異なる場合がある、という事実である。

ある OS/400リリースではコンパイルが通ったとしても別の OS/400リリースでは

コンパイル・エラーとなってしまうことである。

このことに対する対応を紹介する前に CRTBNDRPG CRTSQLRPGI のコマンドの

「生成重大度」パラメータを比較してみよう。

CRTBNDRPG の例

                           バインド RPG PGM の作成  (CRTBNDRPG)              
                                                                        
      選択項目を入力して,実行キーを押してください。                         
                                                                        
      プログラム  . . . . . . . . . .   *CTLSPEC       名前 , *CTLSPEC       
        ライブラリー  . . . . . . . .     *CURLIB      名前 , *CURLIB        
      ソース・ファイル  . . . . . . .   QRPGLESRC      名前 , QRPGLESRC      
        ライブラリー  . . . . . . . .     *LIBL        名前 , *LIBL, *CURLIB   
      ソース・メンバー  . . . . . . .   *PGM           名前 , *PGM           
      ソース・ストリーム・ファイル                                           
                                                                        
      生成重大度レベル  . . . . . . .   10            0-20                   
      テキスト ' 記述 ' . . . . . . .   *SRCMBRTXT                           
                                                                        
      省略時の活動化グループ  . . . .   *YES          *YES, *NO              
                                                                             

 

ご覧のように生成重大度レベルは 0-20 である。

つまり、エラー重大度が 30以上の場合はオブジェクトは生成されない。

CRTSQLRPGI の例

                        SQL ILE RPG オブジェクト の作成  (CRTSQLRPGI)              
                                                                         
      選択項目を入力して,実行キーを押してください。                              
                                                                             
      オブジェクト  . . . . . . . . .                  名前                       
        ライブラリー  . . . . . . . .     *CURLIB      名前 , *CURLIB             
      ソース・ファイル  . . . . . . .   QRPGLESRC      名前 , QRPGLESRC           
        ライブラリー  . . . . . . . .     *LIBL        名前 , *LIBL, *CURLIB      
      ソース・メンバー  . . . . . . .   *OBJ           名前 , *OBJ                
      ソース・ストリーム・ファイル                                                
                                                                               
      コミットメント制御  . . . . . .   *CHG          *CHG, *ALL, *CS, *NONE...   
      リレーショナル・データベース      *LOCAL                                    
      コンパイル・タイプ  . . . . . .   *PGM          *PGM, *SRVPGM, *MODULE      
      出力リスト  . . . . . . . . . .   *NONE         *NONE, *PRINT               
      テキスト ' 記述 ' . . . . . . .   *SRCMBRTXT            
      プリコンパイラー・オプション      *XREF         *XREF, *NOXREF, *GEN...    
                値の続きは+                                                
      RPG プリプロセッサー・オプション . . . . .   *NONE         *NONE, *LVL1, *LVL2        
      ターゲット・リリース  . . . . .   *CURRENT      *CURRENT, *PRV, V5R3M0, ...
      INCLUDE ファイル  . . . . . . .   *SRCFILE       名前 , *SRCFILE           
        ライブラリー  . . . . . . . .     *LIBL        名前 , *LIBL, *CURLIB     
     SQL INCLUDE  ディレクトリー  . .   *NONE                                    
                                                                            
      データのコピー可能  . . . . . .   *OPTIMIZE     *OPTIMIZE, *YES, *NO       
     SQL カーソルのクローズ   . . . .   *ENDACTGRP    *ENDACTGRP, *ENDMOD        
      ブロック化可能  . . . . . . . .   *ALLREAD      *ALLREAD, *NONE, *READ     
     PREPARE 遅延   . . . . . . . . .   *NO           *NO, *YES                  
      重大度レベル  . . . . . . . . .   10            0-40                        

 

次に CRTSQLRPGI の場合は生成重大度レベルは 0-40 である。

つまり、エラーが 30 であればオブジェクトを生成することができる。

このことを利用すれば出力されたエラーの最大重大度が 30 であればこのパラメータを

10 → 30 に変更してコンパイルすればオブジェクトを生成することができるのである。