oracle中的MODIFY COLUMN - 如何在设置为nullable之前检查列是否可以为空?

时间:2009-06-22 19:22:52

标签: database oracle plsql schema

我正在尝试为一位同事填写一些Oracle工作,并陷入困境。在尝试编写脚本以将列修改为可为空时,我遇到了可爱的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);

2 个答案:

答案 0 :(得分:44)

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

答案 1 :(得分:21)

只需执行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并忽略错误。