データベースからさまざまなプロパティにアクセスするためにプレーンなバニラJDBCコードを使用するアプリケーションがあります。これは、データベースの下には不可知論的です。しかし、それが使用する機能の一つは、(特に、列が、接続のメタデータ上のgetColumnsの結果にIS_AUTOINCREMENTの値にアクセスしてオートインクリメントされるかどうかを判断しようとしている)ドライバはJDBC4に準拠する必要がOracleドライバはJDBC4と本当に互換性があります
は事もJDBC 4準拠するように主張してojdbc6.jarに含まれているOracleのoracle.jdbc.OracleDriverを使用して、それがIS_AUTOINCREMENT列を返していないこと、であるが、JDBC 4仕様に追加しましたこれにより、未知の列に対してSQLExceptionが生成され、アプリケーションがOracle DBに対して使用不能になります。
次のようにOracleのドライバによって実行されたSQLクエリは次のとおりです。
SELECT NULL ASのTABLE_CAT、TABLE_SCHEM AS t.ownerは、table_name AS t.table_name、column_nameに、 DECODE(AS t.column_name 'LONG'、-1、 'DATE'、93、 'RAW'、-3、 'LONG RAW'、-4のいずれかになります。 、 'TIMESTAMP(6)'、93、 'TIMESTAMP(6)WITH TIME ZONE'、-101、 '012' 、 ' IMESTAMP(6)ローカルタイムゾーン '、-102、 'インターバル1年(2)〜月 '、-103、 'インターバル日(2)〜2(6) '、-104、 ' BINARY_FLOAT '、100 'BINARY_DOUBLE'、101、 'XMLTYPE'、2007、DATA_TYPE AS 1111) 、TYPE_NAME AS t.data_type、 DECODE(t.data_precision、ヌル、DECODE(t.data_type、 'CHAR'、 トン。 CHAR_LENGTH、
'VARCHAR'、t.char_length、
'VARCHAR2'、t.char_length、
'NVARCHAR2'、t.char_length、
'NCHAR'、t.char_length、
COLUMN_SIZE、 0 BUFFER_LENGTH AS、 DECODE(t.data_type、 '番号'、DECODE(t.data_precision、
ヌル、-127、AS'NUMBER'、0、t.data_length)、 t.data_precision) DECIMAL_DIGITS AS
t.data_scale)、
t.data_scale)、NUM_PREC_RADIX AS 10、 DECODE(t.nullable、 'N'、0、発言AS 1)AS NULL可能、 NULL、 t.data_default AS COLUMN_DEF 、 0 AS sql_data_type、 0 AS sql_datetime_sub、 t.data_length AS char_octet_length、ORDINAL_POSITION ASt.column_id、t.owner LIKE ALL_TAB_COLUMNS TからAS IS_NULLABLE DECODE(t.nullable、 'N'、 'NO'、 'YES'):1 ESCAPE '/' AND t.table_name LIKE :2 ESCAPE '/' AND t.column_name LIKE :TABLE_SCHEM BY 3 ESCAPE '/' ORDERは、 TABLE_NAME、ORDINAL_POSITION
はこれに任意のドライバ/代替/回避策はありますか?
SQLExceptionに詳細が含まれていますか? –
結果セットに列が存在しないことを示します。私は説明するために実行されたクエリを追加しています。 – Johnco