Oracle 减少在PL SQL中使用冗余SQL循环
在循环中,迭代MIG_table_列表中的table name并禁用所有相应的约束。同一个循环也用于启用约束,如果我可以取消使用循环启用约束?如何取消循环?不要使用Oracle 减少在PL SQL中使用冗余SQL循环,oracle,loops,plsql,for-in-loop,Oracle,Loops,Plsql,For In Loop,在循环中,迭代MIG_table_列表中的table name并禁用所有相应的约束。同一个循环也用于启用约束,如果我可以取消使用循环启用约束?如何取消循环?不要使用executeimmediate,而是使用DBMS\u OUTPUT.PUT\u LINE。将结果复制/粘贴到文件中 运行它以禁用约束 使用编辑器的搜索和替换功能,将禁用替换为启用,然后再次运行脚本 我认为对于禁用启用,您需要使用 FOR k IN (SELECT UC.CONSTRAINT_NAME ,UC.TABLE_NAME
executeimmediate
,而是使用DBMS\u OUTPUT.PUT\u LINE
。将结果复制/粘贴到文件中
- 运行它以禁用约束
- 使用编辑器的搜索和替换功能,将
替换为禁用
,然后再次运行脚本启用
FOR k IN (SELECT UC.CONSTRAINT_NAME ,UC.TABLE_NAME FROM USER_CONSTRAINTS UC
INNER JOIN MIG_TABLE_LIST MIG ON UC.TABLE_NAME = MIG.TABLE_NAME
WHERE UC.TABLE_NAME = MIG.TABLE_NAME AND UC.CONSTRAINT_TYPE IN ('R', 'C', 'U')) LOOP
l_sql := 'ALTER TABLE '||k.TABLE_NAME||' DISABLE CONSTRAINT '||k.CONSTRAINT_NAME||' CASCADE';
EXECUTE IMMEDIATE l_sql;
END LOOP;
和用于启用禁用的约束
FOR k IN (SELECT UC.CONSTRAINT_NAME ,UC.TABLE_NAME FROM USER_CONSTRAINTS UC
INNER JOIN MIG_TABLE_LIST MIG ON UC.TABLE_NAME = MIG.TABLE_NAME
WHERE UC.TABLE_NAME = MIG.TABLE_NAME AND UC.CONSTRAINT_TYPE IN ('R', 'C', 'U') AND UC.STATUS='ENABLED')
LOOP
l_sql := 'ALTER TABLE '||k.TABLE_NAME||' DISABLE CONSTRAINT '||k.CONSTRAINT_NAME||' CASCADE';
EXECUTE IMMEDIATE l_sql;
END LOOP;
我不认为有一种方法可以做到不循环。你认为你需要吗?如果是这样,为什么?我在想是否有办法提高代码的性能不要紧,我将保持循环,您的建议很好,但我需要将其自动化。如果再次禁用禁用约束或启用启用约束,会有什么影响?如您所见,第一个查询只选择启用的约束。因此,如果禁用某些约束,则不会选择它们。
FOR k IN (SELECT UC.CONSTRAINT_NAME ,UC.TABLE_NAME FROM USER_CONSTRAINTS UC
INNER JOIN MIG_TABLE_LIST MIG ON UC.TABLE_NAME = MIG.TABLE_NAME
WHERE UC.TABLE_NAME = MIG.TABLE_NAME AND UC.CONSTRAINT_TYPE IN ('R', 'C', 'U') AND UC.STATUS='DISABLED')
LOOP
l_sql := 'ALTER TABLE '||k.TABLE_NAME||' ENABLE CONSTRAINT '||k.CONSTRAINT_NAME||' CASCADE';
EXECUTE IMMEDIATE l_sql;
END LOOP;