私は同僚のためにOracleの仕事をやろうとしていますが、思わぬ障害に遭遇しました。列をヌル可能に変更するスクリプトを作成しようとすると、素敵なORA-01451エラーが発生しました。
ORA-01451: column to be modified to NULL cannot be modified to NULL
これは、列がすでにNULLであるために発生しています。更新する必要のあるデータベースがいくつかあるため、誤った想定で、この列を手動でNULL可能に設定したかどうかに関係なく、すべてのユーザーが最新の状態になっていることを確認するためにNULLに設定する必要があると考えました。ただし、すでに列をNULL可能として持っている一部のユーザーにとっては、これにより明らかにエラーが発生します。
エラーを回避するために、列がすでにヌル可能かどうかをどのように確認しますか?このアイデアを達成するもの:
IF( MyTable.MyColumn IS NOT NULLABLE)
ALTER TABLE MyTable MODIFY(MyColumn NULL);
PL/SQLでこれを行うことができます。
declare
l_nullable user_tab_columns.nullable%type;
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;
alter tableを実行して例外をキャッチするだけです。
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
または、単にテーブルを変更してエラーを無視します。