![](/img/trans.png)
[英]MyBatis Oracle Call PLS-00306: wrong number or types of arguments in call Error
[英]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.