Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 减少在PL SQL中使用冗余SQL循环_Oracle_Loops_Plsql_For In Loop - Fatal编程技术网

Oracle 减少在PL SQL中使用冗余SQL循环

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

在循环中,迭代MIG_table_列表中的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;