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

ILE RPG ではサブプロシージャーという機能が使用できます。
サブルーチンのようなものですが、引数/戻し値が使用できるのでよりわかりやすいコーディングが可能です。C の関数と同様ですね。

以前簡単な ILE RPG のコードを書いてみたことがあるのですが、それをまたサブプロシージャーを使用して書き直してみました。


サブプロシージャーを使用したバージョン

ソースはちょっとだけ長くなります。(RSPBYSQL_I)
サブプロシージャー自体の定義などの分ですね。

また、サブプロシージャーを使用する場合は、一回 *MODULE オブジェクトを作成して CRTPGM コマンドで *PGM オブジェクトを後から作成する形になります。

CRTSQLRPGI OBJ(ILERPG/RSPBYSQL_I) SRCFILE(ILERPG/QRPGLESRC) COMMIT(*NONE) OBJTYPE(*MODULE)
CRTPGM PGM(ILERPG/RSPBYSQL) MODULE(ILERPG/RSPBYSQL_I)
CALL PGM(ILERPG/RSPBYSQL)
D start_time      S               Z                                                                
D end_time        S               Z                                                                
D time_taken      S             15P 0                                                              
 *                                                                                                 
D CalcResponse    PR            15P 0                                                              
D   start_time                    Z                                                                
D   end_time                      Z                                                                
 *                                                                                                 
 /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                                                                                        
 *                                                                                                
P CalcResponse    B                                                                               
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                                                                               

サブプロシージャー

サブプロシージャーはメインルーティンが終わった後に記述します。

とはいうもののメインルーティンでサブプロシージャーを使用するので、サブプロシージャー名と引数を定義したものを先立って記述しておきます。
これが「プロトタイプ」というもので、サブプロシージャー自体の定義のヘッダ部分を PR と指定することでほぼ流用できます。(というか同じでないと問題があります)
C でいう「プロトタイプ」「プロトタイプ宣言」と同じものですね。

サブプロシージャー名に続く部分が戻り値の指定で、続く行が引数の指定になっています。

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

サブプロシージャーは通常の関数のように使用できます。

 /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                                                                                        

サブプロシージャーの定義は P スペックでの B(Begin) と E(End) にはさまれた間に記述します。

PI で指定したほとんどプロトタイプと共通の仕様と、それに続けて C スペックで処理を記述します。

P CalcResponse    B                                                                               
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                                                                               

このサブプロシージャーを使用したバージョンをさらに、サブプロシージャーを格納したユーティリティモジュールと、それを利用するメインプログラムといったような形に書き直したものがこちらになります。

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

[Top Pageに戻る]

Ads by TOK2