簡體   English   中英

PLS-00306:Java中對GET_NEW_EVENTS的調用中參數的數量或類型錯誤

[英]PLS-00306: wrong number or types of arguments in call to GET_NEW_EVENTS in Java

從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數據庫10g快捷版10.2.0.1.0版-產品Java版本為:1.6。

有人可以幫我解決這個問題。 我一直在嘗試所有可能的解決方案。

奇。 我無法重現。 我正在Windows 7 x64上使用Oracle XE 11.2.0.2.0,以及ojdbc6.jar的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。

那是因為您有一個IN OUT參數,因此必須設置IN,例如:

cs.setInt(1, -2);

然后是已經存在的參數 都。

cs.registerOutParameter(1,OracleTypes.CURSOR); 

有一個問題,就是光標IN不能用作IN參數。 您是否真的要發送refcursor作為參數?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM