Почему масштаб и точность столбцов нумерации в JDBC отличаются от Oracle 10-11? - PullRequest
7 голосов
/ 25 января 2010

Для разработки нашей базы данных мы имеем, с одной стороны, полный сценарий DDL-схемы, для «чистых» установок, а с другой - набор последовательных «дельта-» сценариев для обновлений (каждый сценарий записывается как выполненный или нет в специальной базе данных). таблицу).

Чтобы проверить это, у нас есть цель ant, которая устанавливает более старую версию, обновляет ее и сравнивает схему с вновь созданной. Мы используем метаданные JDBC для сравнения схем, и с 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,
...
) 

Дельта-скрипт:

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:

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 получает эти значения при внутреннем «описании» таблицы для создания метаданных.

Обратите внимание, что обе схемы находятся в одном и том же экземпляре базы данных, и оба соединения JDBC выполняются одной и той же библиотекой JDBC. Те же несоответствия возникают при использовании старого ojdbc14.jar, но никогда в Oracle 10.

Кто-нибудь знает, как это может быть? Я застрял, и мы остались без надежной проверки наших сценариев обновления базы данных.

1 Ответ

1 голос
/ 03 февраля 2010

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

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