SQLパッケージ・プログラムの開発において CRTSQLRPGI
コマンドは
多くの開発者に利用されているはずであるが、正しい利用方法としての注意点を 2つ紹介する。
ひとつは「活動化グループ」についてであり、もうひとつは「生成重大度レベル」についてである。
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)
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 に変更してコンパイルすればオブジェクトを生成することができるのである。