문제

Oracle 10G 데이터베이스에 연결하기 위해 Oracle의 JDBC Thin Driver (10.2.0.3)를 사용하고 있습니다. 데이터베이스 열에 대한 정보를 얻고 싶습니다. resultSetmetadata. 내가 필요한 가장 중요한 정보는 열의 유형과 길이이므로 사용합니다. GetColumnType, GetPrecision, 그리고 getscale 행동 양식.

간단한 쿼리를 위해 작동합니다 (select * from tablename) 열 유형이 "단순"인 경우 VARCHAR2(50), NUMBER(5), NUMBER(6,2). 더 복잡한 쿼리가있는 경우 (select count(*) from tablename) 또는 복잡한 계산이 포함 된 뷰를 기반으로 한 쿼리는 다음과 같은 이상한 결과를 제공합니다.

  • getScale: -127
  • 둘 다 getPrecision 그리고 getScale 0입니다
  • getPrecision: -1

설정 oracle.jdbc.J2EE13Compliant 연결 속성 true (여러 웹 페이지에서 제안한대로)는 getScale = -127을 제거하지만 여전히 0/0 결과를 반환합니다.

이 이상한 결과에 대한 해결 방법을 만들어야 할 가능성이 높지만 먼저 Oracle의 resultSmetAdata의 동작에 대한 포괄적 인 문서가 필요합니다. 예를 들어 모든 SQL 유형에 대한 GetPrecision/GetScale의 의미를 가진 거대한 테이블이 훌륭합니다. 어딘가에 이와 같은 문서가 있습니까?

도움이 되었습니까?

해결책

Oracle은보기 또는 count(*) 명시 적으로 선언되지 않았기 때문에. 시야는보기의 하층 테이블에 따라 정밀도 또는 스케일을 반환 할 수 있습니다.

이를 극복하려면 쿼리에서 유형을 캐스팅하거나 다음과 같이 뷰를 시전해야합니다.

select CAST (count(*) AS NUMBER(30))

다른 팁

대안은 쿼리입니다 user_tab_columns 또는 all_tab_columns.

0의 스케일은 허용됩니다 : 숫자 (5)는 숫자 (5,0)와 동일합니다.

그러나 정밀도는 정의 될 때 1에서 38 사이의 정수 여야합니다. 숫자와 같이 정의되지 않은 경우 운전자는 NULL을 반환 할 수 없으므로 무언가를 반환해야합니다. 이 경우 운전자는 0을 반환하기로 선택합니다.

resultsetmetadata에 대한 포괄적 인 문서가없는 것 같습니다.Oracle® 데이터베이스 JDBC 개발자 안내서 및 참조 10G 릴리스 2 (10.2) 그리고 11G 릴리스 2 (11.2) 열 이름과 유형에 대한 예제를 제공합니다 여기, 그들은 다른 측면을 다루지 않습니다.

누군가가 있었다 비슷한 문제 몇 년 전에 PostgreSQL과 함께 패치를 만들었습니다. 아마도 Oracle은 여기에서 동일한 코드베이스를 사용합니다.

OJDBC14를 사용하려고 할 수 있습니다_g클래스가 "javac -g"로 컴파일 된 OJDBC14.jar 대신 .jar는 일부 추적 정보를 포함합니다.

당신은 또한 시도 할 수도 있습니다 최신 드라이버.

당신은 사용할 수 있습니다 rs.getBigDecimal(columnIndex) 그리고 큰 소수점에서 특정 열의 정밀 / 스케일 값을 얻을 수 있습니다.

귀하의 질문에 대한 직접적인 답변은 아니지만 귀하가 언급 한 해결 방법 :

DB Schemas를 점검하거나 비교하기 만하면 resultsetmetadata 대신에 모든 테이블을 쿼리하는 것만으로도 설명대로 Oracle Schema 정보를 사용합니다. 리버스 엔지니어링 데이터 모델. 내 유틸리티에서 그러한 정보를 텍스트로 내보내는 데 사용했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top