Подтвердить что ты не робот

ИЗМЕНИТЬ КОЛОНКУ в оракуле - Как проверить, является ли столбец допустимым?

Я пытаюсь заполнить для коллеги работу над Oracle, и столкнулся с ней. При попытке написать script, чтобы изменить столбец до значения NULL, я столкнулся с прекрасной ошибкой ORA-01451:

ORA-01451: column to be modified to NULL cannot be modified to NULL

Это происходит потому, что столбец уже равен NULL. У нас есть несколько баз данных, которые необходимо устранить, поэтому в моем ошибочном предположении я решил установить его в NULL, чтобы он работал по всем направлениям, чтобы убедиться, что все были в курсе событий, независимо от того, установили ли они этот столбец вручную или нет. Однако это, по-видимому, вызывает ошибку для некоторых людей, у которых уже есть столбец как обнуляемый.

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

IF( MyTable.MyColumn IS NOT NULLABLE)
   ALTER TABLE MyTable MODIFY(MyColumn  NULL);
4b9b3361

Ответ 1

Вы можете сделать это в PL/SQL:

declare
  l_nullable varchar2(1);
begin
  select nullable into l_nullable
  from user_tab_columns
  where table_name = 'MYTABLE'
  and   column_name = 'MYCOLUMN';

  if l_nullable = 'N' then
    execute immediate 'alter table mytable modify (mycolumn null)';
  end if;
end;

Ответ 2

просто выполните таблицу alter и поймайте исключение.

DECLARE
   allready_null EXCEPTION;
   PRAGMA EXCEPTION_INIT(allready_null, -1451);
BEGIN
   execute immediate 'ALTER TABLE TAB MODIFY(COL  NULL)';
EXCEPTION
   WHEN allready_null THEN
      null; -- handle the error
END;
/

если вы не хотите использовать PL/SQL

    set feedback off
    set echo off
    set feedback off
    set pages 0
    set head off

    spool to_null.sql

    select 'alter table TAB modify (COL NULL);' 
    from user_tab_columns
    where table_name = 'TAB'
    and column_name = 'COL'
    and nullable = 'N';

    spool off
    set feedback on
    set echo on
    set termout on
    @@to_null.sql 
    host rm -f to_null.sql

или просто выполните таблицу alter и проигнорируйте ошибку.