ИЗМЕНИТЬ КОЛОНКУ в оракуле - Как проверить, является ли столбец допустимым?
Я пытаюсь заполнить для коллеги работу над 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);
Ответы
Ответ 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 и проигнорируйте ошибку.