甲骨文可重入改变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_cols
或 dba_tab_cols
.
另一种选择是使用异常处理程序并丢弃异常,如下所示:
begin
execute immediate 'alter table MATABLE modify (MADATA null)';
exception
when others then
null;
end;
这是正常行为。
它可能在两种情况下发生:
1)如果你的字段列是约束
2) 如果您已经将字段列定义为允许 NULL 值。
我有一个 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_cols
或 dba_tab_cols
.
另一种选择是使用异常处理程序并丢弃异常,如下所示:
begin
execute immediate 'alter table MATABLE modify (MADATA null)';
exception
when others then
null;
end;
这是正常行为。
它可能在两种情况下发生:
1)如果你的字段列是约束
2) 如果您已经将字段列定义为允许 NULL 值。