从 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 版本 10.2.0.1.0 - 产品 Java版本是:1.6。
有人可以帮我解决这个问题吗?我一直在尝试所有可能的解决方案来解决这个问题。
最佳答案
奇怪。我无法重现这个。我在 Windows 7 x64 上使用 Oracle XE 11.2.0.2.0,ojdbc6.jar
版本为 11.2.0.2.0。
我没有你的表,所以我查询了数据字典 View 。我创建了以下包
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。
关于java - PLS-00306 : wrong number or types of arguments in call to GET_NEW_EVENTS in Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12751878/