2014-11-25 7 views
2

저는 JDBC를 처음 사용하고있어 왔습니다. 포럼의 다른 게시물은 JDBC가 Oracle PLSQL Boolean 유형을 지원하지 않음을 나타냅니다. 그것은 않습니다처럼 oracle jdbc documentation에서JDBC가 Oracle을 지원하지 않는 이유 부울 유형

보인다 : 정말 이상한 것을 발견

enter image description here

그러나 another section에 그것이 PL/SQL 저장 프로 시저 부울 매개 변수의 통과를 허용하지 않습니다 말한다.

설명서 자체가 모순되지 않습니까?

PL/SQL 프로 시저/함수에서 부울 값을 전달하거나 허용하지 않습니다. 그것은 다음과 같은 예외를 제공합니다 :

Exception occured in the database 
Exception message: Invalid column type: 16 
Database error code: 17004 
java.sql.SQLException: Invalid column type: 16 
    at oracle.jdbc.driver.OracleStatement.getInternalType(OracleStatement.java:3963) 
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameterInternal(OracleCallableStatement.java:135) 
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:304) 
    at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:393) 
    at oracle.jdbc.driver.OracleCallableStatementWrapper.registerOutParameter(OracleCallableStatementWrapper.java:1579) 
    at com.HrManager.insertNewEmployee(HrManager.java:1300) 
    at com.HrManager.main(HrManager.java:1411) 

JDBC Oracle 드라이버가 부울 유형을 지원하지 않는 이유를 이해하려고합니다. PL/SQL "Boolean"이 null 값을 허용하고 Java의 원시 유형 "boolean"이 그렇지 않기 때문입니까?

그러나 카운터는 Java의 래퍼 클래스 "Boolean"이 null을 허용합니다. 이것은 PLSQL의 부울 유형에 매핑하는 데 사용할 수 있습니다. 어떤 사람은 이것에 대해 더 많은 것을 밝힐 수 있습니까?

+0

[제안 할 선례가 있습니다.] (http://its-all-about-oracle.blogspot.com/2013/11/invalid-column-type-16.html) 정수형 대신에 부울이지만,이 오류를 얻기 위해 작성한 것을 보여주십시오. – Makoto

+0

@Makato가 언급 한 경우 "hibernate.dialect"속성의 값을 "org.hibernate.dialect.OracleDialect"에서 "org.hibernate.dialect.Oracle9iDialect"로 변경합니다. – RBz

답변

2

는에서 오라클 JDBC 드라이버가 호출 인수를 지원 또는 비 스칼라 요소 유형과 PL/SQL의 RECORD, BOOLEAN, 또는 테이블의 값을 반환하는 PL/SQL TABLE, BOOLEAN, and RECORD Types

그것은 가능하지 않습니다. 그러나 Oracle JDBC 드라이버는 스칼라 요소 유형의 PL/SQL 인덱스 바이 테이블을 지원합니다.

... PL/SQL 레코드 부울 또는 비 - 라 테이블 형태의 해결 방법으로서

, JDBC 의해 지원되는 유형으로서 데이터를 처리 용기 절차를 생성한다. 예를 들어, PL/SQL 부울을 사용하는 저장 프로 시저를 래핑하려면 JDBC에서 문자 또는 숫자를 가져 와서 BOOLEAN으로 원래 프로 시저에 전달하거나 출력 매개 변수의 경우 원본에서 BOOLEAN 인수를 받아들이는 저장 프로 시저를 만듭니다 프로 시저를 호출하여 JDBC에 CHAR 또는 NUMBER로 전달합니다. 마찬가지로 PL/SQL 레코드를 사용하는 저장 프로 시저를 래핑하려면 CHAR 및 NUMBER와 같은 개별 구성 요소 또는 구조화 된 개체 유형의 레코드를 처리하는 저장 프로 시저를 만듭니다. PL/SQL 테이블을 사용하는 저장 프로 시저를 래핑하려면 데이터를 구성 요소로 분해하거나 Oracle 컬렉션 유형을 사용하십시오. 즉 BOOLEAN를 지원하지 않는 이유 없도록

-1

자바는 ResultSetCallableStatementwasNull의 방법을 사용하여 원시 값을 널 값을 지원한다.

그러나 링크 된 문서는 not supported이라고 말합니다. oracle specific extensions을 사용할 수 있습니다. 이 문서는 또한 an example workaround에 연결됩니다 (매개 변수 전달에 대해서는 OUT이 유추하기 쉽습니다).

관련 문제