SQL 表関数と ILE RPG でフラッシュバック・クエリ!? (V5R4)

DB2 for i でフラッシュバック・クエリ!? (V5R4)」を「ジャーナル情報のSQLでの取得 (V5R4)」で紹介した表関数を使った SQL を使用して書き直してみました。

ジャーナルを準備する CL が必要なくなるので、シンプルに RPG 一本だけで作成することができます。

     H DFTACTGRP(*NO)                                                                               
      *                                                                                             
     D FILE          E DS                  EXTNAME(QCUSTCDT)                                        
     D                                     BASED(p)                                                 
      *                                                                                             
     D ENTRY_TS        S               z                                                            
     D TYPE            S              2a                                                            
     D ENTRY           S                   sqltype(BLOB:500)                                        
      *                                                                                             
     D p               S               *                                                            
      /free                                                                                         
                                                                                                    
          exec sql DECLARE C1 CURSOR FOR                                                            
                   select entry_data,                                                               
                          entry_timestamp,                                                          
                          journal_entry_type                                                        
                     from table (                                                                   
                          Display_Journal(                                                          
                            'QIWSTEST', 'QSQJRN',                                                   
                            '', '*CURCHAIN',                                                        
                            CAST('2009-12-16 00:00:00.000000' as TIMESTAMP),                        
                            CAST(null as DECIMAL(21,0)),                                            
                            'R',                                                                    
                            '',                                                                     
                            'QIWSTEST','QCUSTCDT', '*QDDS','',                                      
                            '', -- User                                                             
                            '', -- Job                                                              
                            ''  -- Program                                                          
                                           )                                                        
                                  ) as J                                                            
                    ORDER BY entry_timestamp ;                                                      
                                                                                                    
          exec sql OPEN C1 ;                                                                        
                                                                                                    
          dou (%subst(SQLSTATE:1:2) <> '00') ;                                                      
             exec sql FETCH C1 INTO :ENTRY,                                                         
                                    :ENTRY_TS,                                                      
                                    :TYPE   ;                                                       
             if %subst(SQLSTATE:1:2) = '02' ;                                                       
                leave ;                                                                             
             endif ;                                                                                
             p = %addr(ENTRY_data) ;                                                                
             dsply '====== '    ;                                                                   
             // Logging Information                                                                 
             dsply type     ;                                                                       
             dsply entry_ts ;                                                                       
             // Table Row Information                                                               
             dsply CUSNUM ;                                                                         
             dsply LSTNAM ;                                                                         
             dsply INIT   ;                                                                         
             dsply STREET ;                                                                         
             dsply CITY   ;                                                                         
             dsply STATE  ;                                                                         
             dsply ZIPCOD ;                                                                         
             dsply CDTLMT ;                                                                         
             dsply CHGCOD ;                                                                         
             dsply BALDUE ;                                                                         
             dsply CDTDUE ;                                                                         
          enddo ;                                                                                   
                                                                                                    
          exec sql CLOSE C1 ;                                                                       
          *inlr = *on ;                                                                             
          return ;                                                                                  
                                                                                                    
      /end-free                                                                                     

いくつか注意点を。

RPG で BLOB をあつかう

テーブルの行イメージとなる ENTRY_TYPE カラムは BLOB という SQL データタイプになります。

ILE RPG で BLOB を扱う場合、↓のような定義になります。

     D ENTRY           S                   sqltype(BLOB:500)                                        

500 バイトの BLOB という定義ですね。(詳細はインフォメーション・センターを参照してください)

コンパイル・リストを見ると↓のように展開されているのがわかります。

ポインタは ENTRY_DATA の方の(ENTRY ではなく)アドレスを取得する必要があるわけですね。

             p = %addr(ENTRY_data) ;                                                                

RPG で TIMESTAMP をあつかう

ログの時刻は SQL データタイプで TIMESTAMP になっています。
これは ILE RPG ではデータタイプ Z として定義された変数で扱うことができます。

     D ENTRY_TS        S               z                                                            

SQL データタイプと ILE RPG のデータタイプとの対応についてはインフォメーション・センターを見てみてください。

[Top Pageに戻る]

Ads by TOK2