代码之家  ›  专栏  ›  技术社区  ›  boly38

oracle可重入alter表

  •  0
  • boly38  · 技术社区  · 7 年前

    我有一个SQL脚本要执行多次(必须是可重入的)。

    alter table MATABLE modify (MADATA null);
    

    Erreur SQL : ORA-01451: colonne à modifier en non renseignée (NULL) ne peut être passée à NULL
    01451. 00000 -  "column to be modified to NULL cannot be modified to NULL"
    

    这是因为约束在第一次执行时已被删除,不再存在。

    如何执行相同的脚本而不出错?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Thomas Tschernich    7 年前

    您可以使用数据字典视图 user_tab_cols 在执行更新之前检查表。

    declare
        lCount number;
    begin
    
        select count(*) into lCount from user_tab_cols
        where table_name = 'MATABLE'
        and column_name = 'MADATA'
        and nullable = 'N';
    
        if (lCount = 1) then
            execute immediate 'alter table MATABLE modify (MADATA null)';
        end if;
    
    end;
    

    用户tab\u cols 仅包含与登录用户处于相同架构中的表的信息。如果您正在修改其他用户的表,则可以使用 all_tab_cols dba_tab_cols .

    另一种选择是使用异常处理程序并丢弃异常,如下所示:

    begin
        execute immediate 'alter table MATABLE modify (MADATA null)';
    exception
        when others then
            null;
    end;
    
        2
  •  0
  •   Frank    7 年前

    这是正常行为。

    它可以在两种情况下发生:

    2) 如果已经将字段列定义为允许空值。