2011-11-24 19 views
2

我试图在postgresql中编写示例存储函数,并使用JDBC提供的CallableStatement调用它们。CallableStatement PostgreSQL:无效的参数数量错误

下面是一些我的测试代码

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

我不认为你需要一个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)); 
} 
+0

嘿,谢谢你的回复,我已经做好了准备工作。只是想知道如何使用CallableStatement .. – KodeSeeker

+0

我不认为这是可能的。使用CallableStatement,您需要一个OUT参数(例如REF CURSOR)以处理结果。但是你创建你的函数的方式并没有定义一个refcursor。我认为使用SELECT是唯一的选择。 –

2

您正在通过可调用语句来调用一个函数抵销。这不会发生!你会一直得到一个错误。

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