我试图在postgresql中编写样本存储函数,并使用JDBC提供的CallableStatement调用它们。
这是我的一些测试代码
Consumer bean =new Consumer();
CallableStatement pstmt = null;
try {
con.setAutoCommit(false);
String query = "{ ? = call getData( ? ) }";
pstmt = con.prepareCall(query);
pstmt.registerOutParameter(1, Types.OTHER);
pstmt.setInt(2,5);
pstmt.execute(); // execute update statement
bean=(Consumer)pstmt.getObject(1);
System.out.println("bean"+bean.getConsumer_name());
我的存储功能就是这种形式。
CREATE FUNCTION getData(int) RETURNS SETOF db_consumer AS $$
SELECT * FROM db_consumer WHERE consumer_id = $1;
$$ LANGUAGE SQL;
但是,当我尝试运行代码时,我收到以下错误。
org.postgresql.util.PSQLException: A CallableStatement was executed with an invalid number of parameters .
知道为什么会这样吗?
答案 0 :(得分:4)
我认为您不需要CallableStatement,因为您应该可以直接运行select * from getData(5)
:
PreparedStatement pstmt = con.prepareStatement("select * from getData(?)")
pstmt.setInt(1,5);
ResultSet rs = pstmt.execute();
while (rs.next()) {
System.out.println(rs.getString(1));
}
答案 1 :(得分:2)
您正尝试通过Callable Statement调用SETOFF函数。这不会发生!你总会得到一个错误
PostgreSQL的存储函数可以以两种不同的方式返回结果。该函数可以返回refcursor值或SETOF某种数据类型。根据使用哪种返回方法确定应该如何调用函数。
不应通过CallableStatement接口调用将数据作为集合返回的函数,而应使用普通的Statement或PreparedStatement接口。