Для нашей разработки базы данных у нас есть с одной стороны полная схема сценарий DDL для установок царапины, и на другом ряде последовательных сценариев "дельты", для обновлений (каждый сценарий зарегистрирован, как выполняется или не в специальной таблице базы данных).
Для тестирования этого, у нас есть целевой объект Ant, которые устанавливают более старую версию, обновления он, и сравнивает схему с недавно созданной. Мы используем JDBC MetaData для сравнения схем, и с Oracle 10 это работало отлично просто.
Теперь мы обновили до Oracle 11 и переместились от ojdbc14.jar до ojdbc6.jar. Тест все еще работает зеленый на Oracle 10, но на Oracle 11 мы добираемся (два типичных примера):
Table <table X> has column <column A> as NUMBER(1,0) NOT NULL in <new schema>, but as NUMBER(0,0) NOT NULL in <upgraded schema>
Table <table Y> has column <column B> as NUMBER(0,-127) NOT NULL in <new schema>, but as NUMBER(0,0) NOT NULL in <upgraded schema>
Взгляды почти (-127 не хороший масштаб теперь, являются им), хорошо, если мы сделали что-то не так. Но те же самые файлы работали прежде и здесь являются положениями сценария:
Сценарий DDL:
CREATE TABLE <table X> (
...
<column B> NUMBER(1) DEFAULT 0 NOT NULL,
...
)
CREATE TABLE <table Y> (
...
<column B> NUMBER DEFAULT 1 NOT NULL,
...
)
Сценарий Delta:
ALTER TABLE <table X> ADD (
<column A> NUMBER(1) DEFAULT 0 NOT NULL
)
ALTER TABLE <table Y> ADD (<column B> NUMBER DEFAULT 1 NOT NULL)
И вот код JDBC MetaData:
public class Column {
String name;
int scale;
int precision;
boolean nullable;
String type;
public Column(ResultSetMetaData metaData, int column) throws SQLException {
name = metaData.getColumnName(column);
type = metaData.getColumnTypeName(column);
scale = metaData.getScale(column);
precision = metaData.getPrecision(column);
nullable = metaData.isNullable(column) == ResultSetMetaData.columnNullable;
}
@Override
public String toString() {
return type + "(" + precision + "," + scale + ") "
+ (nullable ? "NULL" : "NOT NULL");
}
}
Да, индекс столбца запускается от 1, и это - toString () значение, которое используется для сравнения различных столбцов (также используемый в выводе ошибок выше).
Я отладил этот код и насколько я вижу, драйвер JDBC Oracle получает эти значения, внутренне "описывая" таблицу для создания MetaData.
Обратите внимание, что обе схемы находятся в том же самом экземпляре базы данных, и соединения JDBC оба сделаны той же самой библиотекой JDBC. Те же несоответствия производятся при использовании более старого ojdbc14.jar, но никогда в Oracle 10.
У кого-либо есть какой-либо вход о том, как это может быть? Я застреваю, и нас оставляют без trustable теста наших сценариев обновления базы данных.
Я бы проголосовал за собой ошибку в драйвере OJDBC. Тем не менее, я бы, вероятно, позвоню в пакетах DBMS_METADATA
для извлечения DDL. ResultsetTetAdata ResultsetMetAdata
кажется более сосредоточенным на определении типов в результате набора результатов, а не определение метаданных самих объектов базы данных.