2011-11-24 4 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

난 당신이 직접 select * from getData(5)을 실행할 수 있어야합니다 당신이 된 CallableStatement를 필요가 있다고 생각하지 않습니다 당신은 호출 가능 문을 통해 SETOFF 함수를 호출하려고

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의 stored 함수는 두 가지 방식으로 결과를 반환 할 수 있습니다. 이 함수는 refcursor 값 또는 SETOF 일부 데이터 형식을 반환 할 수 있습니다. 이러한 리턴 메소드 중 어 @ 것이 사용되는지에 따라 함수를 호출하는 f}을 결정합니다.
데이터를 세트로 리턴하는 함수는 CallableStatement 인터페이스를 통해 호출하면 안되며, 대신 정상적인 Statement 또는 PreparedStatement 인터페이스를 사용해야합니다.

관련 문제