配列データ型を引数に持つOracleストアドプロシージャをコールする

 Oracleの配列データ型(VARRAYやネストした表)や、ユーザ定義型(RECORD) を引数に持つストアドプロシージャを、JDBCでコールするサンプルです。

package test.jdbc;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;

/**
 * Oracleのネストした表をINパラメータにとるプロシージャをコールするサンプルです。
 */
public class CallProcWithNestabExample {
    public static void main(String[] args) {
        Connection conn = null;
        CallableStatement st = null;
        try {
            // Oracle JDBC driverをロードします。
            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
            conn = DriverManager.getConnection(
       "jdbc:oracle:thin:@falcon.center.nsnhnkmmkk.co.jp:1521:ORCL",
       "DEVUSER", "DEVPASS");
            // ストアドプロシージャの実行文を解析
            st = conn.prepareCall("{call TEST_PKG.GET_SUM(?, ?)}");
            // 入力引数の値をセット
            String[] values = {"18", "25", "104", "53", "29"};
            ArrayDescriptor ad = new ArrayDescriptor("TEST_ARRAY", conn);
            ARRAY array = new ARRAY(ad, conn, values);
            //st.setObject(1, array, Types.ARRAY);
            st.setArray(1, array);
            // ↑はどちらでもOK

            // 出力引数の型を指定
            st.registerOutParameter(2, java.sql.Types.INTEGER);
            // プロシージャの実行
            st.execute();
            // 結果の取得
            int result = st.getInt(2);
            System.out.println("result=" + result);
        } catch (SQLException ex) {
            System.out.println("Ootto! " + ex.getMessage());
            ex.printStackTrace();
        } finally {
            if(st != null){
                try { st.close(); } catch(SQLException e_){ }
            }
            if(conn != null){
                try { conn.close(); } catch(SQLException e_){ }
            }
        }
    }
}

ArrayDescriptorとARRAYはOracle JDBCドライバの独自クラスです。 ARRAYはJDBCのArrayインターフェースを実装しているので、Statement#setArray()の引数に渡せます。 ArrayDescriptorに渡している「TEST_ARRAY」というのはOracleにおけるデータ型、 つまりTYPEオブジェクトの名前です。

JDBC and Swing Top

(first uploaded 2006/01/03 last updated (not ever), URANO398)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル