RPG と SQL のあれこれ (INSERT の動的SQL、ホスト変数、自動タイムスタンプ)

最近、ある程度の件数のあるテーブルがテスト用に必要になりました。
データは埋まっていればよく、とりあえずは同じレコードの繰り返しでも、入っていればいい、という状況だったので、埋め込み SQL のプログラムでやってみよう、と思って作ってみました。

テーブル名や必要なデータ件数が変わる度にいちいちコンパイルし直すのも面倒なので、引数として指定することにしました。結果として動的 SQL になっています。

テーブルは一応最初に手動で作成することにしました。

CREATE TABLE TESTLIB/DATA10000
(ID CHAR ( 5) NOT NULL WITH DEFAULT,
 A CHAR ( 10) NOT NULL WITH DEFAULT,
 B CHAR ( 10) NOT NULL WITH DEFAULT,
 C CHAR ( 10) NOT NULL WITH DEFAULT,
 NUMBER NUMERIC ( 7, 0) NOT NULL WITH DEFAULT,
 TS TIMESTAMP NOT NULL WITH DEFAULT)

各行に、その行が生成された時のタイムスタンプを格納したカラムを作ることにしました。
あらかじめ "current timestamp" と PREPARE 対象の SQL 文に指定しておけばいいわけです。

         stmt = 'insert into ' + name +                                                             
               ' values(?, ?, ?, ?, ?, current timestamp )';                                        
         exec sql prepare s1 from :stmt;

データ件数は、面倒なので一万件を一口とした口数で指定するようにしています。

     H DFTACTGRP(*NO)                                                                               
      *                                                                                             
     D PopulateDB      PR                                                                           
     D  name                         10a                                                            
     D  count                         3u 0                                                          
      *                                                                                             
     D PopulateDB      PI                                                                           
     D  name                         10a                                                            
     D  pcount                        3u 0                                                          
      *                                                                                             
     D loop            S              7p 0                                                          
     D count           S              7p 0                                                          
      *                                                                                             
     D id              S              5a                                                            
     D a               S             10a   inz('AAAAAAAAAA')                                        
     D b               S             10a   inz('BBBBBBBBBB')                                        
     D c               S             10a   inz('CCCCCCCCCC')                                        
     D num             S              5i 0 inz(5000)                                                
      *                                                                                             
     D stmt            S            512a                                                            
      /free                                                                                         
                                                                                                    
         stmt = 'insert into ' + name +                                                             
               ' values(?, ?, ?, ?, ?, current timestamp )';                                        
         exec sql prepare s1 from :stmt;                                                            
                                                                                                    
         count = %dec(pcount) ;                                                                     
         count = count * 10000 ;                                                                    
         for loop = 1 to count ;                                                                    
           id = %char(loop);                                                                        
           exec sql execute s1                                                                      
                    USING :id, :a, :b, :c, :num ;                                                   
         endfor ;                                                                                   
                                                                                                    
         *inlr = *on;                                                                               
         return;                                                                                    
                                                                                                    
      /end-free

タイムスタンプは RPG 側で取得させることもできます。

     H DFTACTGRP(*NO)                                                                               
      *                                                                                             
     D PopulateDB      PR                                                                           
     D  name                         10a                                                            
     D  count                         3u 0                                                          
      *                                                                                             
     D PopulateDB      PI                                                                           
     D  name                         10a                                                            
     D  pcount                        3u 0                                                          
      *                                                                                             
     D loop            S              7p 0                                                          
     D count           S              7p 0                                                          
      *                                                                                             
     D id              S              5a                                                            
     D a               S             10a   inz('AAAAAAAAAA')                                        
     D b               S             10a   inz('BBBBBBBBBB')                                        
     D c               S             10a   inz('CCCCCCCCCC')                                        
     D num             S              5i 0 inz(5000)                                                
     D ts              S               z                                                            
      *                                                                                             
     D stmt            S            512a                                                            
      /free                                                                                         
                                                                                                    
         stmt = 'insert into ' + name +                                                             
               ' values(?, ?, ?, ?, ?, ? )';                                                        
         exec sql prepare s1 from :stmt;                                                            
                                                                                                    
         count = %dec(pcount) ;                                                                     
         count = count * 10000 ;                                                                    
         for loop = 1 to count ;                                                                    
           id = %char(loop);                                                                        
           ts = %timestamp() ;                                                                      
           exec sql execute s1                                                                      
                USING :id, :a, :b, :c, :num, :ts ;                                                  
         endfor ;                                                                                   
                                                                                                    
         *inlr = *on;                                                                               
         return;                                                                                    
                                                                                                    
      /end-free

[Top Pageに戻る]

Ads by TOK2