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 に変更してコンパイルすればオブジェクトを生成することができるのである。