データベース応答時間の計測 (ILE RPG V5R4 版)

以前作成した「データベース応答時間の計測」という記事の中の RPG を ILE で書き直してみました。(何かの時にちょっと見てみたら、問題がいくつかありまして ...... )

RPG IV のフリーフォーマット構文と V5R4 からの SQL がそのままコードできる機能を使うとたいへんシンプルになります。これはけっこういいかも。


準備

今回は結果を格納するテーブルの時間を記録するカラムにタイムスタンプ属性を使ってみました。

CREATE TABLE ILERPG/R1 (PROC_TIME DEC (15 , 0) NOT NULL WITH DEFAULT, TIME_BEGAN TIMESTAMP NOT NULL WITH DEFAULT, TIME_END TIMESTAMP NOT NULL WITH DEFAULT)

また、DELETE/INSERT を行うことで結果を確認するテーブルには IBM のオンライン教育でよく使用されている VETEAMxx の中の一番件数の多かったテーブルである PART_DIM を使用することにしました。

コピー先用に新しいスキーマとテーブルを作成しています。

CREATE SCHEMA VETEAM02
CREATE TABLE VETEAM02/PART_DIM LIKE VETEAM01/PART_DIM

ILE RPG なのでレコード長を長く取ったソースファイルを作成して使用します。

CRTSRCPF FILE(ILERPG/QRPGLESRC) RCDLEN(112) IGCDTA(*YES)

ILE RPG での実装

今回まず最初に書き換えた形が以下のようなものになります。(RSPBYSQL_N)
パッと見て全然読みやすく簡単になっているのがわかりますよね。

サブプロシージャーも何も使用していないシンプルな SQL なので CRTRPGPGM のようにいきなり *PGM オブジェクトを作成することが可能です。

CRTSQLRPGI OBJ(ILERPG/RSPBYSQL_N) SRCFILE(ILERPG/QRPGLESRC) SRCMBR(RSPBYSQL_N) COMMIT(*NONE) OBJTYPE(*PGM)
CALL PGM(ILERPG/RSPBYSQL_N)
D start_time      S               Z                                                                 
D end_time        S               Z                                                                 
D time_taken      S             15P 0                                                               
 *                                                                                                  
 /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 = %DIFF (end_time : start_time : *SECONDS);                                         
  //   ↓のように書いてもいいけど  end_time  が必要だったので↑                                     
  // time_taken = %DIFF (%timestamp() : start_time : *SECONDS);                                     
                                                                                                    
     EXEC SQL INSERT INTO R1  (PROC_TIME, TIME_BEGAN, TIME_END)                                     
                    VALUES(:time_taken, :start_time, :end_time);                                    
                                                                                                    
     eval *InLR = *On;                                                                              
 /end-free                                                                                          

ワークフィールドなどは今まで結果のフィールドのところである意味場当たり的に作成できましたが、グローバルなフィールドになってしまうので更新箇所や定義箇所などが分散して、読みにくくなってしまったり、メインテナンスしにくくなる要因になってしまっていた面もあります。
そうしたワークフィールドは最初に D スペックで以下のようにしてまとめて定義をしておきます。

D start_time      S               Z                                                                 
D end_time        S               Z                                                                 
D time_taken      S             15P 0                                                               

V5R4 からは、ソースタイプが SQLRPGLE であれば、EXEC SQL に続けて SQL を直接記述することが可能になっています。

%XX といった形のものがよく出てきていますが、これは組み込み関数 (Built-in Functions) といわれるものです。
CL の %SST や %BIN などでお馴染みだと思いますが、フリーフォーマット RPG の場合はとてもよく使うことになるでしょう。
固定フォーマット RPG などでは、標識を判断の元にしたり、結果のフィールドに戻り値が入ってきたり、といったようにやってきたわけですが、このあたりに発想の転換がちょっとだけ必要になるかもしれませんね。

 /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 = %DIFF (end_time : start_time : *SECONDS);                                         
  //   ↓のように書いてもいいけど  end_time  が必要だったので↑                                     
  // time_taken = %DIFF (%timestamp() : start_time : *SECONDS);                                     
                                                                                                    
     EXEC SQL INSERT INTO R1  (PROC_TIME, TIME_BEGAN, TIME_END)                                     
                    VALUES(:time_taken, :start_time, :end_time);                                    
                                                                                                    
     *InLR = *On;                                                                              
 /end-free                                                                                          

ちなみに ILE RPG からの機能であるサブプローシージャーを使用してこれをさらに書き直してみたのがこちらになりますので、参照してみてください。

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

[Top Pageに戻る]

Ads by TOK2