2013-02-18 2 views
1

오라클 함수를 호출 할 때 항상 null을 반환 :CallableStatement.getResultSet() 나는 다음과 같은 코드를 실행하고

CallableStatement cs; 
cs = conn.prepareCall("{ ? = call mypackage.myfunc()}"); 
cs.registerOutParameter(1, OracleTypes.CURSOR); 
System.out.println(cs.execute()); 
System.out.println(cs.getResultSet()); 
ResultSet rs = (ResultSet) cs.getObject(1); 
System.out.println(rs); 

다음과 같이 함수를 선언 : 문서에 따르면

CREATE OR REPLACE PACKAGE BODY myuser.mypackage AS 
FUNCTION myfunc 
return sys_refcursor 
is 
a_cursor sys_refcursor; 
begin 
open a_cursor for select * from mytable; 
return a_cursor; 
end myfunc; 
end mypackage; 
/

, 경우 결과가 있으면 cs.execute()는 true를 반환하고 cs.getResultSet()은 값을 갖습니다. 그러나 이것은 내가 얻은 결과입니다 :

false 
null 
[email protected] 

Oracle Express 11.2.0 및 최신 드라이버를 사용하고 있습니다.

어떤 힌트/설명/시도해도 대단히 환영합니다.

감사합니다.

답변

2

getResultSet()은 일반적으로 저장 프로 시저 또는 함수 호출이 아닌 SQL SELECT 쿼리의 데이터를 반환하는 PreparedStatement과 함께 사용됩니다. 그래서 나는 당신이보고있는 falsenull 값을 완전히 기대합니다.

하나 이상의 참조 커서를 반환하는 저장 프로 시저가있는 경우 getObject을 사용하여 값을 반입하고이를 ResultSet으로 캐스팅하십시오. 사실, 위의 코드가 정확히 이것을 수행하므로 왜 시도 할 것이 필요한지 이해할 수 없습니다.

SQL SELECT 문은 선택한 데이터를 어딘가에 보내야하지만 데이터에 대한 대상 역할을하는 SQL에 바인드 매개 변수 등을 넣을 수 없으므로이 액세스 권한을 얻기 위해 별도의 메커니즘이 필요합니다. JDBC를 통한 데이터. 이것은 getResultSet()을위한 것입니다. 함수는 바인드 매개 변수를 통해 참조 커서를 반환하므로 바인드 매개 변수를 통해 데이터에 액세스 할 수 있으므로 암시 적 '결과'가 필요하지 않습니다.

+0

안녕 루크, 답장을 보내 주셔서 감사합니다. 매개 변수가 이미 바인딩되어 있고 cs.getObject (1)을 수행 할 수 있기 때문에 getResultSet() 호출이 필요 없다는 것을 알고 있습니다. 그러나 getResultSet()을 반환해야하는 디자인 문제가 있습니다. 커서 (나는이 코드를 제어 할 수 없다. 그 이유가있다. 위 코드는 내가 성취해야 할 것을 보여주기위한 것이다.) 그래서 함수가 실제로 getResultSet() 메소드를 통해 ResultSet을 리턴 할 방법이 없다면 (API는이 점에서 다소 혼란 스럽습니다) 나는 단지 그것을 버리 겠습니다. – Seba

+0

API가 혼란 스럽다고 생각하지 않습니다. 함수는 참조 커서를 반환하지만 숫자 나 문자열을 반환하면 어떻게됩니까? 다른 참조 커서를 반환하는 OUT 매개 변수가 있으면 어떻게됩니까? JDBC는 SQL을 구문 분석하지 않으므로 바인드 매개 변수 1이 함수의 리턴 값임을 알 수 없습니다. 그리고 가능하다해도 JDBC가 참조 커서를 반환하는 함수에 대해 특별한 경우를 만들어야한다고 생각하지 않습니다. –

+0

답변을 주셔서 감사합니다. – Seba

관련 문제