Почему пронумеровал бы масштаб столбцов, и/или точность отличаются по JDBC от Oracle 10 to 11?

Для нашей разработки базы данных у нас есть с одной стороны полная схема сценарий 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 теста наших сценариев обновления базы данных.

7
задан Mirvnillith 25 January 2010 в 16:18
поделиться

1 ответ

Я бы проголосовал за собой ошибку в драйвере OJDBC. Тем не менее, я бы, вероятно, позвоню в пакетах DBMS_METADATA для извлечения DDL. ResultsetTetAdata ResultsetMetAdata кажется более сосредоточенным на определении типов в результате набора результатов, а не определение метаданных самих объектов базы данных.

1
ответ дан 7 December 2019 в 20:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: