RPG と SQL のあれこれ (オブジェクトのリスト、処理件数の取得)

"オブジェクトのリスト"と"外部データ構造の配列"

DB2/400 で Java Persistence API (既存テーブルの関係・結合の表現)」で以下のようなコードがあります。

                List<Employee> employeeList = department.getEmployees();
                int howmany = employeeList.size();
                for (int i = 0; i < howmany; i++) {
                        Employee employee = employeeList.get(i);
                        String employeeName = employee.getEmployeeName();
                        System.out.println("従業員名は " + employeeName);
                        }

Employee というオブジェクトをリストの中の要素として扱う、というコーディングですが、これって「RPG と SQL のあれこれ (外部データ構造の配列とカラム名の個別変更)」で使った、データベーステーブルをひとつのデータ構造としてさらに配列にして扱う、というやり方に似てませんかね??

JPA などの O/R マッピングを見ても、"オブジェクト"というのは要するにデータ構造(とそのアクセスメソッド) なわけで、C やRPG のような手続き型言語でもテクニックとしては応用の効くものなのだな、と思います。

SQL カーソルの処理した件数の取得

今回は、SQLCA (SQL 通信領域[Communication Area]) の使い方の一例です。SQLCA については「RPG と SQL のあれこれ (データ構造と SQLCA、定数の定義)」でもふれましたが、通常 RDB なら共通の SQL コーディングの仕組みです。

FETCH などで件数を指定してまとまった行 (レコード) を取ってくることができるわけですが、実際にその行数いっぱいまで結果が返ってくるとは限りません。

SQLCA の中に SQLERRD(3) という、問い合わせ結果の行数が入ってくる領域が定義されています。これを使うと、余計な行を処理してしまうようなことをなくすことができるわけですね。

     D CustRow       E DS                  ExtName(QCUSTCDT) Qualified                              
     D                                     DIM(100)                                                 
      *                                                                                             
     D LastName      E                     EXTFLD(LstNam)                                           
      *                                                                                             
     D i               S              3  0                                                          
     D howmany         S              3  0                                                          
      /Free                                                                                         
                                                                                                    
             EXEC SQL    include sqlca;                                                             
                                                                                                    
             EXEC SQL    DECLARE CustCSR  Cursor For                                                
                           SELECT * FROM QIWS/QCUSTCDT ;                                            
                                                                                                    
             EXEC SQL    OPEN CustCSR ;                                                             
                                                                                                    
             EXEC SQL    FETCH CustCSR FOR 50 ROWS                                                  
                                INTO :CustRow ;                                                     
                                                                                                    
             howmany = SQLERRD(3);                                                                  
             for i = 1 to howmany;                                                                  
               DSPLY CustRow(i).LastName ;                                                          
             Endfor ;                                                                               
                                                                                                    
             EXEC SQL    CLOSE CustCSR ;                                                            
                                                                                                    
             *inlr = *on ;                                                                          
             return ;                                                                               
                                                                                                    
      /END-FREE

[Top Pageに戻る]

Ads by TOK2