Изменить все единицы столбца с байта на символ - PullRequest
4 голосов
/ 16 ноября 2011

Мне дали задание преобразовать огромную базу данных в MS SQL Server в Oracle. База данных содержит более 150 таблиц с множеством ограничений, значений по умолчанию и взаимосвязей, а также с множеством хранимых процедур и триггеров. Теперь мне интересно 2 вещи:

  1. Как это обычно делается? Нужно ли делать это вручную для каждого объекта по очереди или есть какой-то лучший способ?
  2. Строковые столбцы в Oracle по умолчанию создаются в байтовых единицах. Как я могу обновить все столбцы во всех таблицах от байта к символу?

Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 07 мая 2013

Для 2: будет создан код для обновления всех столбцов BYTE до CHAR

BEGIN
    FOR x in (SELECT * FROM user_tab_columns WHERE data_type LIKE 'VARCHAR%' and CHAR_USED = 'B')
    LOOP
        DBMS_OUTPUT.PUT_LINE('ALTER TABLE '||x.table_name||' MODIFY '||x.column_name||' '||x.data_type||'('||x.data_length||' CHAR)');
    END LOOP;
END;
/
1 голос
/ 16 ноября 2011

Я перенес базу данных MS SQL Server в Informix с самодельным пакетом, который использовал метаданные ADO.NET для получения структуры БД. Я сделал это, потому что я не мог найти подходящий инструмент для этого преобразования. Я бы не советовал этот подход с базами данных, которые могут быть перенесены с помощью инструмента exisitng.
Таким образом, в случае перехода на Oracle лучше использовать некоторые из существующих инструментов, таких как:

http://www.oracle.com/technetwork/database/migration/sqlserver-095136.html

0 голосов
/ 16 мая 2019

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

    BEGIN
    FOR X IN (SELECT C.TABLE_NAME, 
                     C.COLUMN_NAME,
                     C.DATA_TYPE,
                     C.DATA_LENGTH
                FROM USER_TAB_COLUMNS C
               WHERE DATA_TYPE LIKE 'VARCHAR%' 
                AND CHAR_USED = 'B'
                AND NOT EXISTS (SELECT 1 FROM USER_VIEWS V WHERE V.VIEW_NAME = C.TABLE_NAME))
    LOOP
        EXECUTE IMMEDIATE('ALTER TABLE '||X.TABLE_NAME||' MODIFY '||X.COLUMN_NAME||' '||X.DATA_TYPE||'('||X.DATA_LENGTH||' CHAR)');
    END LOOP;
    END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...