ORACLEで一時的にPK、FKを無効にする方法

開発中、一時的に外部キーを無効にしたくなる場合がある。
例えば、大量のデータを流し込むときなど。
そんな場合は下記のようなプロシージャが便利。

無効化するプロシージャ

CREATE OR REPLACE PROCEDURE ENABLE_PK_FK
IS
	CURSOR curPK is select * from USER_CONSTRAINTS where CONSTRAINT_TYPE = 'P';
	rowPK	curPK%ROWTYPE;
	CURSOR curFK is select * from USER_CONSTRAINTS where CONSTRAINT_TYPE = 'R';
	rowFK	curFK%ROWTYPE;

	sqlAlt	varchar2(1000);
BEGIN
	for rowPK in curPK loop
		sqlAlt := 'alter table ' || rowPK.TABLE_NAME || ' enable constraint ' || rowPK.CONSTRAINT_NAME;
		execute immediate sqlAlt;
	end loop;

	for rowFK in curFK loop
		sqlAlt := 'alter table ' || rowFK.TABLE_NAME || ' enable constraint ' || rowFK.CONSTRAINT_NAME;
		execute immediate sqlAlt;
	end loop;
END;
/

有効化するプロシージャ

CREATE OR REPLACE PROCEDURE DISABLE_PK_FK
IS
	CURSOR curPK is select * from USER_CONSTRAINTS where CONSTRAINT_TYPE = 'P';
	rowPK	curPK%ROWTYPE;
	CURSOR curFK is select * from USER_CONSTRAINTS where CONSTRAINT_TYPE = 'R';
	rowFK	curFK%ROWTYPE;

	sqlAlt	varchar2(1000);
BEGIN
	for rowFK in curFK loop
		sqlAlt := 'alter table ' || rowFK.TABLE_NAME || ' disable constraint ' || rowFK.CONSTRAINT_NAME;
		execute immediate sqlAlt;
	end loop;
	for rowPK in curPK loop
		sqlAlt := 'alter table ' || rowPK.TABLE_NAME || ' disable constraint ' || rowPK.CONSTRAINT_NAME;
		execute immediate sqlAlt;
	end loop;
END;
/