1

Java からストアド プロシージャを呼び出しているときに、次のエラーが発生します。

"java.sql.SQLException: [Oracle][ODBC][Ora]ORA-06550: 行 1、列 7: PLS-00306: 'GET_NEW_EVENTS' への呼び出しで引数の数または型が正しくありません ORA-06550: 行 1、列7: PL/SQL: ステートメントは無視されました"

ストアド プロシージャは次のとおりです。

    create or replace package body event_subscription as
    procedure get_new_events( p_events in out SYS_REFCURSOR ) as
    begin
        open p_events for
            select log_id from event_alert_log;         
    end get_new_events;
end event_subscription;

ストアド プロシージャを呼び出す Java コードは次のとおりです。

    sqlString = "BEGIN event_subscription.get_new_events(?); END;";
CallableStatement  cs = connection.prepareCall(sqlString);
cs.registerOutParameter(1,OracleTypes.CURSOR);
cs.execute(); // This line is failing and throwing the SQLException
ResultSet rs = (ResultSet) cs.getObject(1);

Oracle のバージョン: Oracle Database 10g Express Edition Release 10.2.0.1.0 - 製品 Java のバージョン: 1.6。

誰かがこの問題で私を助けてくれますか? 私はこの問題に対して考えられるすべての解決策を試してきました。

4

2 に答える 2

1

奇数。これを再現できません。Windows 7 x64 で Oracle XE 11.2.0.2.0 をバージョン 11.2.0.2.0 で使用していますojdbc6.jar

あなたのテーブルがないので、代わりにデータ ディクショナリ ビューをクエリしました。次のパッケージを作成しました

create or replace package event_subscription as
   procedure get_new_events( p_events out SYS_REFCURSOR );
end;

create or replace package body event_subscription as
    procedure get_new_events( p_events out SYS_REFCURSOR )
    as
    begin
        open p_events for
            select object_name, object_type from all_objects where rownum <= 10;
    end get_new_events;
end event_subscription;

そして、次の Java クラスをコンパイルしました。

import java.sql.*;

public class So12751878 {
    public static void main(String[] args) throws Exception {
        new oracle.jdbc.OracleDriver();
        Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "user", "password");
        String sqlString = "BEGIN event_subscription.get_new_events(?); END;";
        CallableStatement cs = connection.prepareCall(sqlString);
        cs.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
        cs.execute();
        ResultSet rs = (ResultSet) cs.getObject(1);
        while (rs.next()) {
            System.out.println("Got '" + rs.getString(1) + "' and '" + rs.getString(2) + "'.");
        }
    }
}

これは正常に実行されました。ストアド プロシージャのパラメータを から に変更した場合も、正常に実行されOUTましたIN OUT

編集: コメントで、JDBC-ODBC ブリッジ ドライバーを使用して Oracle に接続していることを明確にしました。ただし、パラメータの型を として登録していますoracle.jdbc.OracleTypes.CURSOR。このタイプは Oracle JDBC ドライバーに固有のものであるため、複数のデータベースをサポートする必要があることを考えると、JDBC-ODBC ブリッジ ドライバーが理解できるとは思わないものです。

OracleTypes.*教訓:定数を使用している場合は、JDBC-ODBC ブリッジ ドライバを使用して Oracle に接続しないでください。さらによいのは、JDBC-ODBC ブリッジ ドライバを使用して Oracle に接続しないことです。

于 2012-10-05T22:36:15.917 に答える
0

これは、IN OUT パラメータがあるためです。たとえば、次のように IN を設定する必要があります。

cs.setInt(1, -2);

そして、あなたがすでに持っているoutparameter。両方。

cs.registerOutParameter(1,OracleTypes.CURSOR); 

IN パラメーターとして機能しないカーソル IN を使用すると、問題が発生します。パラメータとして refcursor を本当に送信しますか?

于 2012-10-05T19:48:55.350 に答える