powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Смена типа атрибута таблицы в существующей схеме с данными
8 сообщений из 8, страница 1 из 1
Смена типа атрибута таблицы в существующей схеме с данными
    #32142636
Fedorchenko Aleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть схема, на которой отлаживаются разработчики и время от времени эта схема перекидывается на preproduction сервер (показывается потенциальным заказчикам).

Изначально проект был не наш, но потом нам его передали на доработку, поэтому приходится время от времени править структуру таблиц.

Столкнулся с проблемой, что прежние разработчики ориентируясь на 9i, абсолютно игнорировали lob типы данных: надо хранить большой текст - будет varchar2(1000), надо изображение - raw. В итоге иногда происходит обрезка данных :(

Вот...
Обычный alter table понятное дело тут не пройдет, да и к тому же на таблицы наложены индексы и констрейнты, а сами таблицы тесно завязаны между собой.

Сегодня меня это дело достало, залез в ман, но ничего не нашел по теме. Пришлось писать самому. А раз так, то постарался сделать код совместимым с 8i и независимым от пользователя (пакет имеет спецификацию AUTHID CURRENT_USER). Проверил на наших схемах - работает (происходит смена типа данных без потери самих данных, констрейнтов и индексов). Но мало ли что... Нужен взгляд со стороны. Зацените, покритикуйте...

Вот сама процедура смены типа , а вот ее проверка .

PS: На тех таблицах, что я тестировал, нет составных индексов, поэтому затрудняюсь предположить поведение моей процедуры :)

PPS: Здесь сама процедура, не пакет :)
...
Рейтинг: 0 / 0
Смена типа атрибута таблицы в существующей схеме с данными
    #32142654
_kozyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Весьма полезная программка. А конвертить LONG/LONG RAW в CLOB/BLOB не приходится? Oracle может не преобразовать к новому типу данных напрямую.
...
Рейтинг: 0 / 0
Смена типа атрибута таблицы в существующей схеме с данными
    #32142655
Fedorchenko Aleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_kozyr
А конвертить LONG/LONG RAW в CLOB/BLOB не приходится?
Дык... Именно это и приходится делать :)
Я ж написал в своем посте об этом - раньше данные лежали в varchar2 или raw.
...
Рейтинг: 0 / 0
Смена типа атрибута таблицы в существующей схеме с данными
    #32142657
_kozyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RAW и LONG/LONG RAW - это разные типы.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
   1 * create table test_convert(id number, raw_col long)
SQL> /

Таблица создана.

   1 * insert into test_convert values ( 1 , 'dd')
SQL> /

 1  строка создана.

SQL> commit;

Фиксация обновлений завершена.

SQL> alter table test_convert add(clob_col clob);

Таблица изменена.

SQL> update test_convert
   2   set clob_col=raw_col;
set clob_col=raw_col
             *
ошибка в строке  2 :
ORA- 00932 : inconsistent datatypes: expected CLOB got LONG


в тоже время

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
   1 * create table test_convert(id number, raw_col raw( 1000 ))
SQL> /

Таблица создана.

   1 * insert into test_convert values ( 1 , '1')
SQL> /

 1  строка создана.

SQL> alter table test_convert add( clob_col clob);

Таблица изменена.

SQL> update test_convert set clob_col = raw_col;

 1  строка обновлена.
...
Рейтинг: 0 / 0
Смена типа атрибута таблицы в существующей схеме с данными
    #32142659
_kozyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если надо преобразовывать LONG в CLOB и LONG RAW в BLOB, то пригодится ф-я TO_LOB. Но, к сожалению, она работает только для INSERT SELECT и цепочку UPDATE ... set temp_col=col ..., UPDATE ... set col=temp_col вам придется пересматривать
...
Рейтинг: 0 / 0
Смена типа атрибута таблицы в существующей схеме с данными
    #32142662
_kozyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще было бы неплохо в конце процедуры перекомпилировать INVALID'ов, которые появятся после ALTER TABLE
...
Рейтинг: 0 / 0
Смена типа атрибута таблицы в существующей схеме с данными
    #32143315
Fedorchenko Aleksey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_kozyr
RAW и LONG/LONG RAW - это разные типы
Согласен! Действительно не то сказал :(

Внес изменения для конвертации LONG->CLOB и LONG RAW->BLOB и оформил-таки в виде пакета: спецификация , тело , проверка .

Проверил на указанных типах - работает. При попытке их конвертации не в LOB выдается ошибка.

Вот только не понял почему не работает автономная транзакция - должна ведь!

И еще было бы неплохо в конце процедуры перекомпилировать INVALID'ов, которые появятся после ALTER TABLE
Можно, но только у меня нет таких констрейнтов - все валидные! При удалении столбца таблицы удаляются и констрейнты/индексы.

Жду замечаний и предложений.
...
Рейтинг: 0 / 0
Смена типа атрибута таблицы в существующей схеме с данными
    #32143391
_kozyr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно, но только у меня нет таких констрейнтов - все валидные! При удалении столбца таблицы удаляются и констрейнты/индексы.
Я хотел сказать, что на таблицах могут быть основаны PROCEDURE, FUNCTION, PACKAGES, VIEWS. И все они получат статус INVALID после ALTER TABLE. Эти зависимости можно получить из USER_DEPENDENCIES.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Смена типа атрибута таблицы в существующей схеме с данными
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]