PostgreSQL11及以上版本JDBC调用引用游标存储过程的正确方式
PostgreSQL JDBC 调用带引用游标存储过程的正确性与优化方案
你的实现正确性确认
你当前的代码是正确的。对于INOUT类型的引用游标参数,PostgreSQL JDBC驱动要求先绑定输入值(即使是null),再注册输出参数,这样才能正确识别参数位置和类型。传入null是合法的,因为存储过程会负责打开游标并返回结果集,PostgreSQL会自动为未指定名称的游标分配临时名称。
更优实现方案
以下是几个可以优化的方向:
1. 用try-with-resources自动管理资源
Java 7及以上的try-with-resources语法可以自动关闭Connection、CallableStatement和ResultSet,避免手动关闭遗漏导致的资源泄漏,这是JDBC开发的最佳实践:
try { Properties props = new Properties(); props.setProperty("escapeSyntaxCallMode", "call"); // 自动关闭Connection和CallableStatement try (Connection conn = DriverManager.getConnection(url, props); CallableStatement cs = conn.prepareCall("{call public.pr_sampleuser(?,?)}")) { conn.setAutoCommit(false); cs.setString(1, "Umesh"); cs.registerOutParameter(2, Types.REF_CURSOR); // 省略cs.setObject(2,null):PostgreSQL驱动会自动处理INOUT参数的输入默认值 cs.execute(); // 自动关闭ResultSet try (ResultSet resultSet = (ResultSet) cs.getObject(2)) { while (resultSet.next()) { String firstName = resultSet.getString("first_name"); String lastname = resultSet.getString("last_name"); String address = resultSet.getString("address"); System.out.println(firstName); System.out.println(lastname); System.out.println(address); } } } } catch (SQLException e) { System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage()); e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }
2. 修改存储过程参数为OUT类型(推荐)
如果你的场景不需要传入游标名称,只是从存储过程获取游标结果,可以将参数类型从INOUT改为OUT,这样JDBC代码无需设置输入值,直接注册输出参数即可,逻辑更简洁:
修改后的存储过程:
CREATE OR REPLACE PROCEDURE public.pr_sampleuser( p_firstuser character varying, OUT p_qusers refcursor) LANGUAGE 'plpgsql' AS $BODY$ BEGIN OPEN p_qusers FOR SELECT first_name,last_name,address FROM public.test_user WHERE UPPER(first_name) = UPPER(p_firstuser); END; $BODY$;
对应JDBC代码:
只需保留cs.registerOutParameter(2, Types.REF_CURSOR),去掉cs.setObject(2,null)即可,其他逻辑和上面的try-with-resources版本一致。
3. 指定游标名称(可选)
如果需要自定义游标名称,可以传入具体的字符串而非null,比如:
cs.setString(2, "user_cursor"); cs.registerOutParameter(2, Types.REF_CURSOR);
这种方式在需要手动管理游标生命周期的场景下有用,但普通查询场景下无需额外设置。
内容的提问来源于stack exchange,提问作者Ashu
相关产品推荐
相关产品推荐

