Sql oracle可重入alter表

Sql oracle可重入alter表,sql,oracle,alter-table,reentrancy,Sql,Oracle,Alter Table,Reentrancy,我有一个要执行多次的SQL脚本,它必须是可重入的 脚本行之一是 alter table MATABLE modify (MADATA null); 当有效删除表MATABLE的列MADATA的“NOTNULL”约束时,此命令工作良好。但第二次,我犯了一个错误,例如: Erreur SQL : ORA-01451: colonne à modifier en non renseignée (NULL) ne peut être passée à NULL 01451. 00000 - "col

我有一个要执行多次的SQL脚本,它必须是可重入的

脚本行之一是

alter table MATABLE modify (MADATA null);
当有效删除表MATABLE的列MADATA的“NOTNULL”约束时,此命令工作良好。但第二次,我犯了一个错误,例如:

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脚本?

您可以在执行更新之前使用数据字典视图用户选项卡检查表

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仅包含与登录用户处于相同架构中的表的相关信息。如果您正在修改其他用户的表,则可以使用所有选项卡或dba选项卡

另一种选择是使用异常处理程序,然后扔掉异常,如下所示:

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

这是正常的行为

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

如果字段列是约束,则为1


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

我对oracle了解不够,无法告诉您如何操作,但我假设您可以检查表的结构,并且仅在列不可为空时执行脚本的这一部分。完美答案。非常感谢:@boly38我更改了答案,但请注意,视图“用户”选项卡“列和用户”选项卡“列都适用于您。事实上,问题如下:只需将“装入”替换为“装入”。使用“装入”代替“装入”将导致异常。as用于为列指定别名。into用于将列的值保存到局部变量。因此,在本例中,into是正确的。理解这一点,我希望有一个类似于@Thomas Tschernich答案的解决方案。无论如何谢谢你