在Oracle修改列 - 如何检查列是否设置可空之前可空?(MODIFY COLUMN in ora

2019-06-23 21:45发布

我试图填补在做一些工作甲骨文一位同事,并遇到了一个障碍。 在试图写一个脚本来修改列空的,我遇到了可爱的ORA-01451错误:

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

这是发生因为列已经是NULL。 我们需要几个数据库进行udpated,所以在我错误的假定,我想它设置为NULL应该全线合作,以确保每个人都是最新的,不管他们是否已经手动设置此列可空与否。 然而,这显然引起了一些人谁已经有列可为空的错误。

如何一个校验列是否已经为空的,以避免错误? 东西会做到这一点的想法:

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

Answer 1:

你可以在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;


Answer 2:

只是做了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

或者只是做ALTER TABLE和忽略的错误。



文章来源: MODIFY COLUMN in oracle - How to check if a column is nullable before setting to nullable?