在 PL SQL 中减少对冗余 SQL 的使用循环
Reduce using loop for redundant SQL in PL SQL
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..in循环之上,迭代table name in MIG_TABLE_LIST
并禁用所有相应的约束。同样的循环也用于启用约束,如果我可以摆脱使用循环启用约束怎么办?
如何摆脱循环?使用 DBMS_OUTPUT.PUT_LINE
而不是 EXECUTE IMMEDIATE
。 Copy/paste 将结果存入文件。
- 运行 禁用约束
- 使用编辑器的搜索和替换功能,将
DISABLE
替换为ENABLE
,然后再次运行脚本。
我认为要禁用 enabled 你需要使用类似
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;
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..in循环之上,迭代table name in MIG_TABLE_LIST
并禁用所有相应的约束。同样的循环也用于启用约束,如果我可以摆脱使用循环启用约束怎么办?
如何摆脱循环?使用 DBMS_OUTPUT.PUT_LINE
而不是 EXECUTE IMMEDIATE
。 Copy/paste 将结果存入文件。
- 运行 禁用约束
- 使用编辑器的搜索和替换功能,将
DISABLE
替换为ENABLE
,然后再次运行脚本。
我认为要禁用 enabled 你需要使用类似
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;