Драйвер Oracle действительно совместим с JDBC4 - PullRequest
1 голос
/ 23 ноября 2010

У меня есть приложение, которое использует простой ванильный код JDBC для доступа к различным свойствам из базы данных. Это агностик базы данных под.

Однако одна из функций, которые он использует, требует, чтобы драйвер был совместим с JDBC4 (в частности, он пытается определить, автоинкрементен ли столбец, получая доступ к значению IS_AUTOINCREMENT для результата getColumns в метаданных соединения)

См .: 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

Дело в том, что даже при использовании Oracle oracle.jdbc.OracleDriver, содержащегося в ojdbc6.jar, который утверждает, что является JDBC 4-совместимым, он не возвращает столбец IS_AUTOINCREMENT, добавленный в спецификацию в JDBC 4. Это создает исключение SQLEx для неизвестный столбец и делает приложение непригодным для Oracle dbs.

SQL-запрос, выполняемый драйвером Oracle, выглядит следующим образом:

SELECT NULL AS table_cat, t.owner AS table_schem, t.table_name AS table_name, t.column_name AS column_name, DECODE (t.data_type, 'CHAR', 1, 'VARCHAR2', 12, 'NUMBER', 3, «LONG», -1, «DATE», 93, «RAW», -3, «LONG RAW», -4,
«BLOB», 2004, «CLOB», 2005, «BFILE», -13, «FLOAT», 6, «TIMESTAMP (6)», 93, «TIMESTAMP (6) с зоной времени», -101, «TIMESTAMP (6) с локальной зоной времени», -102, «ИНТЕРВАЛЬНЫЙ ГОД (2) ДО МЕСЯЦА», -103, «ДЕНЬ ИНТЕРВАЛА (2) ДО ВТОРОГО (6)», -104, «BINARY_FLOAT», 100, «BINARY_DOUBLE», 101, «XMLTYPE», 2007, 1111) AS data_type, t.data_type AS type_name, 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,
'NUMBER', 0, t.data_length), t.data_precision) AS column_size, 0 AS buffer_length, DECODE (t.data_type, 'NUMBER', DECODE (t.data_precision,
ноль, -127,
t.data_scale), * * тысяча двадцать-одна t.data_scale) AS decimal_digits, 10 AS num_prec_radix, DECODE (t.nullable, 'N', 0, 1) AS обнуляется, NULL AS замечания, t.data_default AS column_def, 0 AS sql_data_type, 0 AS sql_datetime_sub, t.data_length AS char_octet_length, t.column_id AS ordinal_position, DECODE (t.nullable, 'N', 'NO', 'YES') AS is_nullable ОТ all_tab_columns t ГДЕ t.owner НРАВИТСЯ : 1 ESCAPE '/' AND t.table_name LIKE : 2 ESCAPE '/' AND t.column_name LIKE : 3 ESCAPE '/' ORDER BY table_schem, имя_таблицы, порядковое_значение

Есть ли какой-нибудь драйвер / альтернатива / обходной путь к этому?

1 Ответ

4 голосов
/ 23 ноября 2010

Ну, это, вероятно, потому что атрибут 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 действительно отличаются от одного поставщика к другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...