JDBC Driver for Oracle

Build 23.0.8839

ストアドプロシージャの呼び出し

ストアドプロシージャの呼び出し

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));
    }
  }
}

Copyright (c) 2024 CData Software, Inc. - All rights reserved.
Build 23.0.8839