甲骨文可重入改变table

oracle reentrant alter table

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

脚本行之一是

alter table MATABLE modify (MADATA null);

当有效删除 table MATABLE 的 MADATA 列的 'not 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"

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

如何不出错地执行同一个脚本? 也许通过 PL/SQL 脚本 ?

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

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;

请注意,user_tab_cols 仅包含与登录用户相同架构中的 table 的信息。如果您正在修改另一个用户的 table,您可以使用 all_tab_colsdba_tab_cols.

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

begin
    execute immediate 'alter table MATABLE modify (MADATA null)';
exception
    when others then
        null;
end;

这是正常行为。

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

1)如果你的字段列是约束

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