web-dev-qa-db-ja.com

OracleのCOLUMNの変更-NULL可能に設定する前に列がNULL可能かどうかを確認する方法

私は同僚のために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);
35
Jay S

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;
44
Tony Andrews

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

または、単にテーブルを変更してエラーを無視します。