1

我尝试调用指定参数名称的存储过程,但 JDBC 无法接受参数。它说:

Method org.postgresql.jdbc4.Jdbc4CallableStatement.setObject(String,Object) is not yet implemented.

我用postgresql-9.2-1003.jdbc4

我还有其他方法可以做到这一点吗?

我知道我可以只指定序列号。但我想指定参数名称,因为这样做更方便。

我的代码:

String call_statement = "{ ? = call procedure_name(?, ?, ?) }";            
CallableStatement proc = connection.prepareCall(call_statement);
proc.registerOutParameter(1, Types.OTHER);            
proc.setObject("param1", 1);
proc.setObject("param2", "hello");
proc.setObject("param3", true);
proc.execute();
ResultSet result = (ResultSet)proc.getObject(1);
4

2 回答 2

2

遗憾的是,PostgreSQL 数据库的 JDBC 4 驱动程序的实现不支持使用参数名称。请参阅GrepCode中此 JDBC 4 实现的代码

但是,您仍然可以继续使用整数(变量或文字)来指示参数的位置。

于 2013-11-01T05:52:08.130 回答
1

现在是 2020 年,Postgres 的标准开源 JDBC 驱动程序仍然不支持CallableStatement.

有趣的是,EnterpriseDB驱动程序确实支持它(话虽如此 - 我尝试使用 EDB JDBC 驱动程序 - 它确实支持命名参数,但它做了很多不同的事情,如果有的话,我们完全排除了这个选项,出于其他原因)

一个对我们有用的解决方案 - 是使用这个“hack”(伪代码,YMMV):

String sql = "SELECT * FROM PROC(IN_PARAM1 => ?, IN_PARAM2 => ?, IN_PARAM => ?)";            
PreparedStatement ps = connection.prepareStatement(sql);
ps.setObject("IN_PARAM1", 1);
ps.setObject("IN_PARAM2", "hello");
ps.setObject("IN_PARAM3", true);
ps.execute();
ResultSet result = (ResultSet)ps.getObject(1);

这种表示法的杀手级功能 - 是使用可选参数调用 SP 的能力(它可以通过具有可选序数参数来实现,但如果你有多个它们 - 这将成为一场噩梦,因为一个人需要传递这么多nulls,太容易数错了,而且很难发现)

还有其他好处,例如返回多个ResultSets(引用)的能力,使用地图作为参数的能力等。

PS:我们也使用相同的技巧Node.jswith node-postgres- 多年来效果很好。

于 2019-12-25T13:13:54.913 回答