CallableStatement PostgreSQL:参数数量无效错误
Posted
技术标签:
【中文标题】CallableStatement PostgreSQL:参数数量无效错误【英文标题】:CallableStatement PostgreSQL :Invalid number of parameters error 【发布时间】:2011-11-24 10:09:50 【问题描述】:我试图在 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 .
知道为什么会发生这种情况吗?
【问题讨论】:
【参考方案1】:我认为您不需要 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));
【讨论】:
嘿,谢谢你的回复,我以前用preparedstatement做过。只是想知道如何使用 CallableStatement.. 我认为这是不可能的。使用 CallableStatement,您需要一个 OUT 参数(例如 REF CURSOR)来处理结果。但是你创建函数的方式并没有定义一个引用。我认为使用 SELECT 是您唯一的选择。【参考方案2】:您正试图通过 Callable 语句调用 SETOFF 函数。那不会发生的!您总是会收到错误消息。 PostgreSQL 的存储函数可以以两种不同的方式返回结果。该函数可能会返回一个 refcursor 值或某个数据类型的 SETOF。根据使用这些返回方法中的哪一个来确定应该如何调用该函数。 以集合形式返回数据的函数不应通过 CallableStatement 接口调用,而应使用普通的 Statement 或 PreparedStatement 接口。
【讨论】:
以上是关于CallableStatement PostgreSQL:参数数量无效错误的主要内容,如果未能解决你的问题,请参考以下文章
说说StatementPreparedStatement和CallableStatement的异同(转)
JDBC之Statement,PreparedStatement,CallableStatement的区别
CallableStatement + registerOutParameter + 多行结果