如何更改表并删除从Select语句作为字符串返回的约束?
假设我有一个包含表的数据库:tblA,tblB,tblC等。如果我运行查询以选择满足特定条件的表,它将返回以下内容:
+------------+------------+
| table_name | constraints|
+------------+------------+
| tblA | consX |
+------------+------------+
| tblB | consY |
+------------+------------+
| tblC | consZ |
+------------+------------+
现在,我想更改每个表并删除它们的约束。因此,例如,不必编写select语句,获取结果,然后在以下位置键入此内容:
alter table tblA drop constraint consX;
alter table tblB drop constraint consY;
alter table tblC drop constraint consZ;
如何在一个查询中完成所有这些步骤?
谢谢。
您可以执行以下操作:
with table_list as
( select 'Foo1' tname from dual
union
select 'Foo2' tname from dual
)
select 'alter table ' || tname || ' drop constraint ' || constraint_name || ';'
from user_constraints, table_list
where user_constraints.table_name = tname;
这将为每个表/约束创建一个作为alter语句构建的字符串。加在WITH子句中查询的表名。请注意,USER_CONSTRAINTS仅列出当前架构的约束。
使用PL / SQL,我会做这样的事情:
DECLARE
CURSOR c_query IS --REPLACE THIS WITH YOUR ACTUAL QUERY
SELECT tableName, conName
FROM dual;
BEGIN
FOR rec IN c_query LOOP
EXECUTE IMMEDIATE 'ALTER TABLE '||rec.tableName||' DROP CONSTRAINT '||rec.conName;
END LOOP;
END;
/