DDL не работает должным образом внутри блока Oracle - PullRequest
1 голос
/ 01 ноября 2011

У меня есть вопрос о запуске сценария ddl в блоке oracle.

В основном я хочу что-то для переноса данных. Если у столбца изменился тип данных, я хочу сначала создать временный столбец, скопировать данные исходного столбца во временный столбец, затем удалить исходный столбец, переименовать временный столбец в исходный, чтобы завершить процесс миграции. Но когда я запускаю приведенный ниже скрипт, он только создает новый временный столбец и копирует данные в новый столбец, но никогда не запускает последние две команды alter table. Может кто нибудь разобраться в чем проблема? Спасибо.

    create table t (a int);

    insert into t values(10);

    --change the data type from integer to varchar2(10);
    begin
      execute immediate 'alter table t modify a varchar2(10)';
    exception when others then
      begin
        execute immediate 'alter table t add b varchar2(10)';
        execute immediate 'update t set b = a';
        execute immediate 'alter tabe t drop column a';
        execute immediate 'alter table t rename column b to a';
      exception when others then
        dbms_output.put_line('cann''t change column a from integer to varchar2(10) due to error:' || sqlerrm);
      end;
    end;
    /

1 Ответ

2 голосов
/ 01 ноября 2011

Вы видите, что у команды drop column alter есть опечатка "alter tabe ...", верно?Если это код, который вы пытаетесь запустить, как только он попадет в этот оператор, вы увидите сообщение об ошибке, и ваша процедура выполняет только первые два оператора execute.

...