Hitachi

ノンストップデータベース HiRDB Version 10 UAP開発ガイド


9.4.5 結果集合返却機能(Javaストアドプロシジャ限定)

Javaストアドプロシジャ定義時に,CREATE PROCEDUREのDYNAMIC RESULT SETS句に1以上の値を指定した場合,結果集合返却機能を使用できます。なお,Javaストアドファンクションについては,結果集合返却機能は使用できません。

〈この項の構成〉

(1) 結果集合返却機能とは

Javaストアドプロシジャ内での,SELECT文の実行によって得られるカーソルを,Javaストアドプロシジャの呼び出し元で参照する機能を,結果集合返却機能といいます。

結果集合返却機能の概要を次の図に示します。

図9‒11 結果集合返却機能の概要(Javaストアドプロシジャの場合)

[図データ]

(2) 結果集合返却機能を使用できる呼び出し元の言語

結果集合返却機能を使用できる呼び出し元の言語を次に示します。

注※

RDBファイル入出力機能を使用していない場合,使用できます。

(3) 結果集合返却機能の使用例

Javaストアドプロシジャ内で,表emps_1及び表emps_2に対して,rank<10の条件を満たす列rank,name,及びageを取得します。呼び出し元で2個の結果集合を受け取り,これらを操作します。

≪Javaストアドプロシジャの定義≫
CREATE PROCEDURE proc2(IN param1 INTEGER)   .........................1
  DYNAMIC RESULT SETS 2   ...........................................2
  LANGUAGE JAVA   ...................................................3
  EXTERNAL NAME   ...................................................4
    'mypack.jar:JStrSmp1.getEmp2(int, ResultSet[], ResultSet[])'   ..4
  PARAMETER STYLE JAVA;   ...........................................5
[説明]
  1. プロシジャ名,パラメタの定義

  2. 返却する検索結果情報数の指定

  3. LANGUAGEの設定

  4. Javaメソッドとの関連づけ

  5. PARAMETER STYLEの設定

≪Javaストアドプロシジャの手続き本体≫
import java.sql.*;   ................................................1
 
public class JStrSmp1{   ............................................2
  public static void getEmp2   ......................................3
    (int jparam1, ResultSet[] rs1_out, ResultSet[] rs2_out)   .......4
          throws SQLException {   ...................................4
    Connection con = DriverManager.getConnection (   ................5
                     "jdbc:hitachi:hirdb");         .................5
    con.setAutoCommit(false);    ....................................6
 
    PreparedStatement pstmt1 = con.prepareStatement   ...............7
        ("select rank,name,age from emps_1 where rank < ?   .........7
         order by rank");   .........................................7
    pstmt1.setInt(1, jparam1);   ....................................7
    ResultSet rs1 = pstmt1.executeQuery();   ........................8
    rs1_out[0] = rs1;   .............................................9
    PreparedStatement pstmt2 = con.prepareStatement   ...............10
        ("select rank,name,age from emps_2 where rank < ?   .........10
         order by rank");   .........................................10
    pstmt2.setInt(1, jparam1);   ....................................10
    ResultSet rs2 = pstmt2.executeQuery();   ........................11
    rs2_out[0] = rs2;   .............................................12
    return;   .......................................................13
  }
}
[説明]
  1. java.sqlパッケージのインポート

  2. クラス名の定義

  3. メソッド名の定義

  4. パラメタ名の定義(第2,第3引数が結果集合返却用)

  5. Connectionオブジェクトの取得

  6. 自動コミットの抑止

  7. SELECT文の前処理

  8. SELECT文の実行

  9. ResultSet[]型の第2引数に,取得した結果集合rs1を設定

  10. SELECT文の前処理

  11. SELECT文の実行

  12. ResultSet[]型の第3引数に,取得した結果集合rs1を設定

  13. 呼び出し終了,及び結果集合返却

≪Javaストアドプロシジャの実行(呼び出し元)≫
import java.sql.*;   ....................................................1
 
public class Caller{   ..................................................2
  public static void main(String[] args) throws SQLException {   ........3
    Connection con = DriverManager.getConnection(   .....................4
                     "jdbc:hitachi:hirdb”,”USER1”,”PASS1");   ...........4
    CallableStatement cstmt = con.prepareCall("{call proc2(?)}");   .....5
    cstmt.setInt(1, 10);   ..............................................5
    ResultSet rs;   .....................................................6
    int emp_rank;   .....................................................6
    String emp_name;   ..................................................6
    int emp_age;   ......................................................6
 
    if(cstmt.execute()){   ..............................................7
       rs = cstmt.getResultSet();   .....................................8
       System.out.println("*** emps_1 ***");   ..........................9
       while(rs.next()){   ..............................................9
         emp_rank = rs.getInt(1);   .....................................9
         emp_name = rs.getString(2);   ..................................9
         emp_age = rs.getInt(3);   ......................................9
         System.out.println("RANK =" + emp_rank +   .....................9
           "  NAME = " + emp_name + "  AGE = " + emp_age);   ............9
         }
    }
    if(cstmt.getMoreResults()){   .......................................10
       rs= cstmt.getResultSet();   ......................................11
       System.out.println("*** emps_2 ***");   ..........................12
       while(rs.next()){   ..............................................12
         emp_rank = rs.getInt(1);   .....................................12
         emp_name = rs.getString(2);   ..................................12
         emp_age = rs.getInt(3);   ......................................12
 
         System.out.println("RANK =" + emp_rank +   .....................12
           "  NAME = " + emp_name + "  AGE = " + emp_age);   ............12
       }
       rs.close();   ....................................................13
    }
  }
}
[説明]
  1. java.sqlパッケージのインポート

  2. クラス名の定義

  3. メソッド名の定義

  4. Connectionオブジェクトの取得

  5. CALL文の前処理

  6. 変数の宣言

  7. CALL文の実行

  8. 結果集合の取得

  9. 1個目の結果集合からの情報を出力

  10. 次の結果集合があるかどうかの確認

  11. 次の結果集合を取得

  12. 2個目の結果集合からの情報を出力

  13. 結果集合のクローズ

(4) 結果集合返却機能を使用する場合の注意事項

(a) CREATE PROCEDUREでのJavaストアドプロシジャ定義時

  1. DYNAMIC RESULT SETS句に,Javaストアドプロシジャ内から返却する結果集合数の最大値を指定します。ここに0を指定した場合,結果集合返却機能は使用できません。

  2. Javaストアドプロシジャのパラメタに設定するResultSet[]型のOUTパラメタは,CREATE PROCEDUREのパラメタには設定しないでください。

  3. EXTERNAL NAMEでJavaプログラムとの対応付けをする場合,ResultSet[]型の引数を含めてください。

(b) 呼び出し元のメソッド作成時

  1. CALL文のパラメタには,Javaストアドプロシジャ用メソッドのResultSet[]型のパラメタを含めないでください。

  2. 返却される結果集合が2個以上の場合,2個目以降の結果集合を受け取るときは,getMoreResult(次の検索結果があるかどうかの確認),及びgetResultSet(次の検索結果を受け取る)メソッドを使用してください。

(c) Javaストアドプロシジャ用のメソッド作成時

検索結果(ResultSet)は,クローズしないでResultSet[]型のOUTパラメタに設定してください。