2010-11-23 3 views
1

일반 바닐라 JDBC 코드를 사용하여 데이터베이스의 다른 속성에 액세스하는 응용 프로그램이 있습니다. 이것은 데이터베이스 밑에 불가사의합니다.오라클 드라이버가 JDBC4와 정말 호환 가능

그러나이 사용하는 기능 중 하나

(열이 연결의 메타 데이터에 getColumns를 결과에 IS_AUTOINCREMENT 값 액세스 autoincremented 경우 특히 결정하려고) JDBC4 준수하도록 운전자를 필요

참조 : http://download.oracle.com/javase/6/docs/api/java/sql/DatabaseMetaData.html#getColumns%28java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String%29

것은 IS_AUTOINCREMENT 열이 JDBC 4 사양에 추가 반환하지 않습니다, 심지어 오라클의 oracle.jdbc.OracleDriver 준수 JDBC 4 주장 ojdbc6.jar에 포함하여 해당된다 이것은 알 수없는 열에 대해 SQLException을 생성하고 Oracle dbs에 대해 응용 프로그램을 사용할 수 없도록 만듭니다.

SELECT NULL AS의 TABLE_CAT, TABLE_SCHEM AS t.owner, TABLE_NAME AS t.table_name, COLUMN_NAME AS t.column_name, DECODE를 (다음과 같이 오라클의 드라이버에 의해 실행

SQL 쿼리입니다 t.data_type, 'CHAR', 1, 'VARCHAR2', 12, 'NUMBER', 3, 'LONG', -1, 'DATE', 93, 'RAW', -3, 'LONG RAW' ,
2005 년 'BLOB', 2005, 'BFILE', -13, 'FLOAT', 6, 'TIMESTAMP , ' IMESTAMP (6) 현지 시간대 ', -102, '년 (2) ~ 월 ', -103, '일간 (2) ~ 초 (6) ', -104, 'BINARY_FLOAT ', 100 'BINARY_DOUBLE'101 'XMLTYPE'2007 DATA_TYPE AS 1,111) , TYPE_NAME AS t.data_type, DECODE (t.data_precision, NULL, DECODE (t.data_type 'CHAR' t. CHAR_LENGTH,
'VARCHAR't.char_length,
'VARCHAR2't.char_length,
'NVARCHAR2't.char_length,
'NCHAR't.char_length,
01,235,'NUMBER'0 t.data_length) t.data_precision) AS COLUMN_SIZE, 0 BUFFER_LENGTH, DECODE (t.data_type 'NUMBER'DECODE (t.data_precision,
NULL, -127 AS, DECIMAL_DIGITS AS
t.data_scale)
t.data_scale) NUM_PREC_RADIX AS DECODE (t.nullable, 'N', 0, AS 비고 1) AS 널, NULL, t.data_default AS COLUMN_DEF , 0 AS sql_data_type, 0 AS sql_datetime_sub, t.data_length AS char_octet_length,WHERE t.owner LIKE ALL_TAB_COLUMNS의 t FROM AS IS_NULLABLE ORDINAL_POSITION, DECODE (t.nullable, 'N', 'NO', 'YES') AS 691,363,210 t.column_id 1 ESCAPE '/'AND t.table_name 를 LIKE : 2 ESCAPE '/'AND t.column_name LIKE : 3 ESCAPE TABLE_SCHEM, TABLE_NAME BY '/'ORDER, ORDINAL_POSITION

어떤 드라이버/대체/해결 방법은 여기에 있습니까?

+0

SQLException에 세부 정보가 포함되어 있습니까? –

+0

열이 결과 집합에 없습니다. 설명하기 위해 실행 된 쿼리를 추가하고 있습니다. – Johnco

답변

4

아마도 이것은 IS_AUTOINCREMENT 속성이 Oracle 데이터베이스와 관련이 없기 때문일 수 있습니다.

물론 모든 JDBC 드라이버가 실제로 사양을 준수하면 쉽지만, 일반적으로 그렇지 않습니다. API 사양에 명시된대로 Resultset.getString("IS_AUTOINCREMENT")은 열의 자동 증가 여부를 확인할 수없는 경우 빈 문자열을 반환해야합니다. 이 동작을 모방하려면

, 난 당신이 다음 코드 조각을 사용하는 것이 좋습니다 : 데이터베이스 무신론자 응용 프로그램을 개발하려는 경우

 
String isAutoincrement = ""; 
try { 
    isAutoincrement = rset.getString("IS_AUTOINCREMENT"); 
} catch (SQLException sqle) { 
    log.warn("IS_AUTOINCREMENT attribute could not be retrieved", sqle); 
} 

을, 당신은 또한 다른 속성 등이 팁을 사용하는 것이 좋습니다 예를 들어 "REMARKS"또는 "COLUMN_DEF"로 표시됩니다. 일반적으로 JDBC 구현은 벤더에 따라 다르므로 코드가 실제로 방어되어야합니다.

+0

오라클은 자동 증가 열을 사용하지 않는다는 것이 핵심입니다. 시퀀스를 만들어 트리거와 함께 열에 연결해야합니다. –

+0

@Tom, 이것이 내가 오라클에게 "관련성이 없다"고 말한 이유입니다.하지만 당신 말이 맞습니다. 제 대답에 좀 더 구체적이어야했습니다. –

+0

그리고 나는 당신의 훌륭한 대답을 단순히 확장하고 있었음을 명확히해야했습니다! –