1

sys_refcursor を返すストアド プロシージャがあり、JDBC を使用して Java からカーソルを取得しようとしています。

plsql ストアド プロシージャ

 create or replace procedure my_proc(p_deptno IN number,p_emp_no IN varchar2
    , p_cursor OUT SYS_REFCURSOR)
    is
    begin
    open p_cursor FOR
    select *
    from emp
    where deptno = p_deptno and emp_number=p_emp_no;
    end proc;
    /

Java コード

callablestatement = connection.prepareCall("{cal my_proc(?,?,?)} ");
callablestatement.setInt(1, param1);
callablestatement.setString(2, param2);
callablestatement.registerOutParameter(3, OracleTypes.CURSOR);
callablestatement.execute();
resultSet = ((OracleCallableStatement)callablestatement).getCursor(4);
            while (resultSet.next()) {
                <classname> = mapList(resultSet);
                logger.info(resultSet.getString(1));
            }

上記を実行すると、次の例外が発生します

java.lang.NullPointerException at callablestatement.execute();

Non supported SQL92 token at position: 3: cal
4

3 に答える 3

1

ステートメントにタイプミスがあります:

{cal my_proc(?,?,?)} 

する必要があります

{call my_proc(?,?,?)} 
于 2012-06-23T09:44:56.227 に答える
0

手順と同じコードの関数を使用して問題を解決し、問題が解決しました。

そして、次の方法で関数を呼び出しました。

private final String FUNCTIONAME= "begin ? :=myfunc(?,?,?); end;"";

ありがとう

于 2012-06-26T06:49:12.237 に答える
0

theCallableStatement.setObject( の代わりに使用

.setString.setIntなど_

theCallableStatement.setNullnullにもあります

しかしregisterOutParameter、同じままにしてください

メソッドの説明

指定されたオブジェクトで指定されたパラメーターの値を設定します。2 番目のパラメーターは Object 型である必要があります。したがって、組み込み型には java.lang と同等のオブジェクトを使用する必要があります。JDBC 仕様は、Java オブジェクト型から SQL 型への標準マッピングを指定します。指定された引数は、データベースに送信される前に、対応する SQL 型に変換されます。このメソッドは、ドライバー固有の Java 型を使用して、データベース固有の抽象データ型を渡すために使用できることに注意してください。オブジェクトがインターフェイス SQLData を実装するクラスの場合、JDBC ドライバーはメソッド SQLData.writeSQL を呼び出して、それを SQL データ ストリームに書き込む必要があります。一方、オブジェクトが Ref、Blob、Clob、NClob、Struct、java.net.URL、または Array を実装するクラスの場合、ドライバは、対応する SQL タイプの値としてデータベースに渡す必要があります。このメソッドは、あいまいさがある場合 (たとえば、オブジェクトが上記のインターフェイスを複数実装しているクラスの場合) に例外をスローします。注: すべてのデータベースで、型指定されていない Null をバックエンドに送信できるわけではありません。移植性を最大限に高めるには、setObject(String parameterName, Object x) の代わりに setNull または setObject(String parameterName, Object x, int sqlType) メソッドを使用する必要があります。

于 2012-06-19T07:51:03.507 に答える