データベース応答時間の計測 (ILE RPG V5R4 サブプロシージャー別ファイル版)

ILE RPG を使用するメリットとも言えるサブプロシージャーの使い方の簡単な紹介がこちらにありますが、今回はより実際の使用に近く、サブプロシージャーを格納したユーティリティプログラム (を想定しているのですが ...... ) とそれを利用するメインプログラムといった形に分割してみました。

また、サブプロシージャーを呼び出すためのプロトタイプ記述についても、二重に記述するのはあまり実際的ではないので /COPY を使うように変更しています。
C でいう「ヘッダファイル」と同じやり方になりますね。


作成方法

ユーティリティプログラムとメインプログラムをそれぞれモジュールとして作成し、CRTPGM で一つの *PGM オブジェクトにまとめます。

ユーティリティプログラムの方は SQL を使用しているわけではないので CRTRPGMOD コマンドでの作成になります。

CRTRPGMOD MODULE(ILERPG/RSPBYSQLSP) SRCFILE(ILERPG/QRPGLESRC)

メインプログラムの方は SQL を使用しているのそのまま CRTSQLRPGI コマンドでの作成になりますね。

CRTSQLRPGI OBJ(ILERPG/RSPBYSQLI2) SRCFILE(ILERPG/QRPGLESRC) COMMIT(*NONE) OBJTYPE(*MODULE)

CRTPGM コマンドで ENTMOD にメインプログラムを指定して *PGM オブジェクトを作成します。

CRTPGM PGM(ILERPG/RSPBYSQL2) MODULE(ILERPG/RSPBYSQLI2 ILERPG/RSPBYSQLSP) ENTMOD(ILERPG/RSPBYSQLI2)

内容

プロトタイプを独立したソースメンバーにしています。 (ILERPG ライブラリーの QRPGLESRC の中の RSTBYSQLPR)

 *                                                                                                  
D CalcResponse    PR            15P 0                                                               
D   start_time                    Z                                                                 
D   end_time                      Z                                                                 
 *                                                                                                  

サブプロシージャーのみを記述したユーティリティープログラム (という想定) になります。

基本的にこちらの元々のソースからサブプロシージャー部分を抜き出したものなのですが、以下の二点が異なっています。

また、プロトタイプを独立させて /COPY で共有して使用するようにしています。

H NOMAIN                                                                                            
 *                                                                                                  
 /COPY ILERPG/QRPGLESRC,RSPBYSQLPR                                                                  
 *                                                                                                  
P CalcResponse    B                   EXPORT                                                        
D CalcResponse    PI            15P 0                                                               
D   start_time                    Z                                                                 
D   end_time                      Z                                                                 
 *                                                                                                  
 /free                                                                                              
                                                                                                    
     return  %DIFF (end_time : start_time : *SECONDS);                                              
                                                                                                    
 /end-free                                                                                          
 *                                                                                                  
P CalcResponse    E                                                                                  

こちらが上記のサブプロシージャーを呼び出すメイン・プログラムになっています。
実質は以前のプログラムからサブプロシージャーの記述をただ削除しただけですね。

プロトタイプの定義は /COPY を使用するように変更しています。

D start_time      S               Z                                                                 
D end_time        S               Z                                                                 
D time_taken      S             15P 0                                                               
 *                                                                                                  
 /COPY ILERPG/QRPGLESRC,RSPBYSQLPR                                                                  
 *                                                                                                  
 /free                                                                                              
     start_time = %timestamp();                                                                     
                                                                                                    
     EXEC SQL DELETE FROM veteam02/part_dim  ;                                                      
                                                                                                    
     EXEC SQL INSERT INTO veteam02/part_dim                                                         
                     SELECT * from veteam01/part_dim ;                                              
                                                                                                    
     end_time = %timestamp();                                                                       
     time_taken = CalcResponse(start_time : end_time);                                              
                                                                                                    
     EXEC SQL INSERT INTO R1  (PROC_TIME, TIME_BEGAN, TIME_END)                                     
                    VALUES(:time_taken, :start_time, :end_time);                                    
                                                                                                    
     *InLR = *On;                                                                              
 /end-free                                                                                          
 *                                                                                                  

今回はモジュールをひとつのプログラムにまとめてしまっています (ユーティリティプログラムも結果として作成された *PGM オブジェクトの一部になっています) が、ユーティリティプログラムの方をサービスプログラム (*SRVPGM) としてメインプログラムから呼び出す形に変更してみたものをこちらに紹介しています。そちらも参考にしてみてください。

あと、作成された *PGM オブジェクトに対する DSPPGM コマンドの出力結果をこちらにおいておきました。

[Top Pageに戻る]

Ads by TOK2