0

Java でストアド関数を呼び出そうとしています。関数にはパッケージがなく、ユーザー (スキーマ) USER の下に配置され、カーソルを返します。私はそれを呼び出すために2つの方法を試しましたが、これらの機能はありません。

最初の1つ

Query query = coreDao.getEntityManager().createNativeQuery("{call USER.gen_rephead_sm_task_report(?, ?) }");
query.setParameter(1, dateFrom);
query.setParameter(2, dateTo);
List<?> queryResult = query.getResultList();

私は得たnot a procedure or not defined

私もこのアプローチを試しました

select gen_rephead_sm_task_report(?, ?) from dual

createNativeQuery パラメータとして使用しますが、結果は同じです。

二つ目

Connection connection = dataSource.getConnection();//javax.sql.DataSource
CallableStatement statement = connection.prepareCall("{? = call USER.gen_rephead_sm_task_report(?, ?) }");
statement.registerOutParameter(1, OracleTypes.CURSOR);//oracle.jdbc.OracleTypes
statement.setDate(2, new java.sql.Date(dateFrom.getTime()));
statement.setDate(3, new java.sql.Date(dateTo.getTime()));
statement.executeQuery();
ResultSet set = ((OracleCallableStatement) statement).getCursor(1);

最後の行で取得しClassCastExceptionました(明らかにOracleCallableStatementはCallableStatementを実装していません)。では、ここではどのタイプを使用する必要がありますか?

4

1 に答える 1

0

わかりましたので、問題を解決するリンクを見つけました ( iDevelopment )。これが私が使ったものです

connection = dataSource.getConnection();
CallableStatement statement = connection.prepareCall(TIMESHEET_QUERY);
statement.registerOutParameter(1, OracleTypes.CURSOR);
statement.setDate(2, new java.sql.Date(dateFrom.getTime()));
statement.setDate(3, new java.sql.Date(dateTo.getTime()));
statement.execute();

ResultSet set = (ResultSet) statement.getObject(1);

すべてがそのままなjavax.sql.*ので、Oracle 固有の API は必要ありません。

于 2012-11-02T11:14:14.337 に答える