ストアドプロシージャの呼び出し
ストアドプロシージャの呼び出し
Oracle OCI は、2つのクラスのストアドプロシージャをサポートしています。- パラメータ化されたストアドプロシージャ呼び出しを実行するには、CallableStatement オブジェクトを使用します。
- EXEC 構文を使用してSQL ステートメントとしてストアドプロシージャを実行するには、Statement オブジェクトを使用します。
CallableStatement オブジェクトの使用
CallableStatement クラスの一般的な実行メソッドを使用して、ストアドプロシージャをパラメータ化されたクエリとして実行できます。ストアドプロシージャの結果を返すには、getResultSet を呼び出します。更新された行の数を返すには、getUpdateCount を呼び出します。
次の例は、SearchSuppliers ストアドプロシージャを実行する方法を示しています。
CallableStatement cstmt = conn.prepareCall("SearchSuppliers"); cstmt.setString("Country", "US"); boolean ret = cstmt.execute(); if (!ret) { int count=cstmt.getUpdateCount(); if (count!=-1) { System.out.println("Affected rows: "+count); } } else { ResultSet rs=cstmt.getResultSet(); while(rs.next()){ for(int i=1;i<=rs.getMetaData().getColumnCount();i++) { System.out.println(rs.getMetaData().getColumnLabel(i) +"="+rs.getString(i)); } } }
PL/SQL サポート
Oracle OCI は、SQL92 エスケープ構文またはOracle PL/SQL ブロック構文のいずれかを使用したPL/SQL ストアドプロシージャおよび無名ブロックの実行をサポートしています。SQL92 エスケープ構文
CallableStatement cs1 = conn.prepareCall ( "{call proc (?,?)}" ) ; // stored proc CallableStatement cs2 = conn.prepareCall ( "{? = call func (?,?)}" ) ; // stored func
Oracle PL/SQL ブロック構文
CallableStatement cs3 = conn.prepareCall ( "begin proc (?,?); end;" ) ; // stored proc CallableStatement cs4 = conn.prepareCall ( "begin ? := func(?,?); end;" ) ; // stored func
関数呼び出しの例
CREATE OR REPLACE FUNCTION FuncSum (arg1 IN INT, arg2 IN INT, arg3 IN INT) RETURN NUMBER IS BEGIN RETURN arg1 + arg2 + arg3 + 1.23456789; END FuncSum;", String query = "begin ? := \"TIGER\".FuncSum('0', 1.1, ?); end;"; statement = connection.prepareCall(query); ParameterMetaData paramsMeta = statement.getParameterMetaData(); Assert.assertEquals(2, paramsMeta.getParameterCount()); Assert.assertEquals(ParameterMetaData.parameterModeOut, paramsMeta.getParameterMode(1)); Assert.assertEquals(Types.DECIMAL, paramsMeta.getParameterType(1)); Assert.assertEquals(ParameterMetaData.parameterModeIn, paramsMeta.getParameterMode(2)); Assert.assertEquals(Types.DECIMAL, paramsMeta.getParameterType(2)); statement.setInt(2, 2); statement.registerOutParameter(1, Types.DOUBLE); statement.execute();
以下のいずれかの方法で結果を読み出します:
System.out.println("Result is: " + statement.getDouble(1));または
ResultSet rs = statement.getResultSet(); if (rs.next()) System.out.println("Result is: " + rs.getDouble(1));
Statement オブジェクトの使用
Statement クラスの実行メソッドを使用して、ストアドプロシージャをSQL ステートメントとして実行できます。ストアドプロシージャの結果を返すには、getResultSet を呼び出します。更新された行の数を返すには、getUpdateCount を呼び出します。
次の例は、SearchSuppliers ストアドプロシージャを実行する方法を示しています。
Statement stmt = conn.createStatement(); boolean ret = stmt.execute("EXEC SearchSuppliers Country = 'US'"); if (!ret) { int count=stmt.getUpdateCount(); if (count!=-1) { System.out.println("Affected rows: "+count); } } else { ResultSet rs=stmt.getResultSet(); while(rs.next()) { for(int i=1;i<=rs.getMetaData().getColumnCount();i++) { System.out.println(rs.getMetaData().getColumnLabel(i) +"="+rs.getString(i)); } } }