2

我试图在 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 .

知道为什么会发生这种情况吗?

4

2 回答 2

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));
}
于 2011-11-24T10:13:41.720 回答
2

您正在尝试通过 Callable 语句调用 SETOFF 函数。那不会发生的!你总是会得到一个错误。

PostgreSQL 的存储函数可以以两种不同的方式返回结果。该函数可能返回一个 refcursor 值或某个数据类型的 SETOF。根据使用这些返回方法中的哪一个来确定应该如何调用该函数。
不应通过 CallableStatement 接口调用以集合形式返回数据的函数,而应使用普通的 Statement 或 PreparedStatement 接口。

于 2011-11-24T10:52:38.673 回答