2011-11-24 33 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接口。