java - 在可调用语句中设置 out 参数

标签 java stored-procedures jdbc callable out-parameters

我正在尝试运行一个使用 oracle jdbc 返回结果集的存储过程。 流程如下。

create or replace procedure display_players (rset OUT sys_refcursor)
as
Begin
open rset for select * from player_data;
End;
/

java代码如下

try {
sql = "{call display_players()}";
call = conn.prepareCall(sql);
call.execute();
rs = call.getResultSet();

while(rs.next()){
    System.out.println(rs.getString("name") + " : " + rs.getString("club"));
}

我尝试将 out 参数注册为

call = conn.prepareCall("{call display_players(?)}");
call.registerOutParameter(1, OracleTypes.CURSOR);

但是该功能不起作用,当前代码也不起作用,因为我收到空指针异常,这意味着未返回结果集。 我该如何实现这一目标?

最佳答案

我认为您还没有完全弄清楚如何从存储过程调用的 OUT 参数获取结果集。

首先,您需要注册 OUT 参数,如第二个代码示例中所示:

call = conn.prepareCall("{call display_players(?)}");
call.registerOutParameter(1, OracleTypes.CURSOR);

但是,执行该语句后,使用 call.getResultSet() 获取 OUT 参数中的结果集是不正确的。例如,假设您正在调用一个存储过程,该存储过程有两个返回游标的 OUT 参数。 call.getResultSet() 应返回哪一个?

技巧是使用 call.getObject(...)call 获取参数值作为 Object 并然后将其转换为 ResultSet。换句话说,替换该行

rs = call.getResultSet();

rs = (ResultSet)call.getObject(1);

关于java - 在可调用语句中设置 out 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42991191/

相关文章:

java - iBatis/MyBatis - 获取结果映射而不是具有自定义键和值的列表

c++ - 将 Informix Object Interface for C++ 用于不带参数的存储过程/函数

function - 在 postgresql 中运行函数抛出运行时错误

java - 数据库连接应该始终保持打开状态还是仅在需要时才打开?

java - 如何以编程方式为 mysql jdbc 驱动程序设置 rewriteBatchedStatements?

javascript - 在 JavaScript 中通过 JDBC 连接到 mysql

java - 使用 @XmlJavaTypeAdapter 映射 Map 时的 JAXB 和空命名空间

java - 将 Primitive 值分配给 Wrapper 类的正确方法

java - Hibernate和mysql错误: Cannot add or update a child row

c# - 如何从存储过程中获取 SQL 字符串结果并将其保存在 C# Windows 应用程序字符串变量中