/**
 *	--	Change Key Information
 */
---------------------------------------------------------------------
/*-- Preparation */
DROP TABLE Temp_Constraints
/
CREATE TABLE Temp_Constraints AS 
SELECT Constraint_Name, Table_Name, Column_Name
FROM User_Cons_Columns WHERE 1=2
/
ALTER TABLE Temp_Constraints ADD Constraint_Type CHAR(1)
/
/**/
---------------------------------------------------------------------
DECLARE
	p_KeyName			VARCHAR2(50) := UPPER('GL_Category_ID');
	--
--	p_SetInfo			VARCHAR(60) := 'C_TaxCategory_ID+999900';
--	p_WhereInfo			VARCHAR(60) := '<105';
	p_SetInfo			VARCHAR(60) := '0';
	p_WhereInfo			VARCHAR(60) := '=105';
	p_execute			BOOLEAN := TRUE;

-----------------------------------------------------------------
	v_Cmd				VARCHAR2(2000);
	--	First PK then R(FK) records
	CURSOR CUR_ConstraintsPR IS	
		SELECT * FROM Temp_Constraints ORDER BY 4;
	--	First R(FK) then PKrecords
	CURSOR CUR_ConstraintsRP IS	
		SELECT * FROM Temp_Constraints ORDER BY 4 DESC;
BEGIN
--	Create Temp Table Content
	DELETE Temp_Constraints;
	--
	INSERT INTO Temp_Constraints
	SELECT Constraint_Name, Table_Name, Column_Name, NULL
	FROM User_Cons_Columns 
	WHERE Constraint_Name IN
		(SELECT Constraint_Name FROM USER_Constraints 
		WHERE R_Constraint_Name IN
			(SELECT Constraint_Name FROM USER_Cons_Columns
			WHERE Constraint_Name NOT LIKE 'SYS%' AND Column_Name = p_KeyName));
	--
	INSERT INTO Temp_Constraints
	SELECT Constraint_Name, Table_Name, Column_Name, NULL
	FROM User_Cons_Columns uc
	WHERE Column_Name = p_KeyName
		AND Constraint_Name NOT LIKE 'SYS%'
		AND NOT EXISTS 
			(SELECT * FROM Temp_Constraints t 
			WHERE t.Constraint_Name=uc.Constraint_Name);
	--
	UPDATE Temp_Constraints t
	  SET Constraint_Type = (SELECT Constraint_Type FROM User_Constraints c 
  							WHERE c.Constraint_Name=t.Constraint_Name);
	--
--	Disable Constraints FK first
	FOR c IN CUR_ConstraintsRP LOOP
		v_Cmd := 'ALTER TABLE ' || c.Table_Name || ' DISABLE ';
		IF (c.Constraint_Type = 'R') THEN
			v_Cmd := v_Cmd || 'CONSTRAINT ' || c.Constraint_Name;
		ELSE
			v_Cmd := v_Cmd || 'PRIMARY KEY';
		END IF;
		DBMS_OUTPUT.PUT_LINE (v_Cmd || ';');
		IF (p_execute) THEN
			EXECUTE IMMEDIATE (v_Cmd);
		END IF;
	END LOOP;
--	Update IDs - FK first
	FOR c IN CUR_ConstraintsRP LOOP
		v_Cmd := 'UPDATE ' || c.Table_Name 
			|| ' SET ' || c.Column_Name || '=' || p_SetInfo
			|| ' WHERE ' || c.Column_Name || p_WhereInfo;
		DBMS_OUTPUT.PUT_LINE (v_Cmd || ';');
		IF (p_execute) THEN
			EXECUTE IMMEDIATE (v_Cmd);
			DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
		END IF;
	END LOOP;
--  Enable Constraints - PK first
	FOR c IN CUR_ConstraintsPR LOOP
		v_Cmd := 'ALTER TABLE ' || c.Table_Name || ' ENABLE ';
		IF (c.Constraint_Type = 'R') THEN
			v_Cmd := v_Cmd || 'CONSTRAINT ' || c.Constraint_Name;
		ELSE
			v_Cmd := v_Cmd || 'PRIMARY KEY';
		END IF;
		DBMS_OUTPUT.PUT_LINE (v_Cmd || ';');
		IF (p_execute) THEN
			EXECUTE IMMEDIATE (v_Cmd);
		END IF;
	END LOOP;
END;
/
DROP TABLE Temp_Constraints
/