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

select * from getData(5)直接実行できるはずなので、CallableStatementは必要ないと思います。

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のストアド関数は、2つの異なる方法で結果を返すことができます。この関数は、refcursor値またはSETOFのデータ型を返す場合があります。これらのreturnメソッドのどれを使用するかによって、関数の呼び出し方法が決まります。
データをセットとして返す関数は、CallableStatementインターフェースを介して呼び出すのではなく、通常のStatementまたはPreparedStatementインターフェースを使用する必要があります。

于 2011-11-24T10:52:38.673 に答える