/**
 *	Create Script for Re-Creating Table
 *	- Drop Dependencies (so that deleting rows does not restrict / trigger deleting dependent tows)
 *	- Copy into temp table
 *	- Drop original table
 *	- Create new Table (not generated)
 *	- Insert data
 *	- Drop temp table
 */
CREATE TABLE TempOut (
	Line Number(10), Text VARCHAR(2000))
/
DECLARE
	p_TableName		VARCHAR2(200) := 'M_ProductionPlan';

	--	Dependency Info
	CURSOR CUR_Dep IS
		SELECT  dep.Table_Name, dep.Constraint_Name, DBA_ConstraintCmd(dep.Constraint_Name) AS Cmd
    	FROM    User_Constraints tab, User_Constraints dep
	    WHERE   tab.Constraint_Name=dep.R_Constraint_Name
    	    AND tab.Constraint_Type='P' AND dep.Constraint_Type='R'
			AND tab.Table_Name=UPPER(p_TableName);
	No					NUMBER(10) := 1;
	--	Table Column Info
	CURSOR CUR_Col IS
		SELECT 	COLUMN_NAME 
		FROM 	USER_TAB_COLUMNS 
		WHERE 	TABLE_NAME = UPPER(p_TableName)
		ORDER BY COLUMN_ID;
	v_Line			VARCHAR2(2000) := '';
BEGIN
	--	Dependency Info
	INSERT INTO TempOut VALUES (0, '-- 1 -- Dependencies');
	FOR d IN CUR_Dep LOOP
		--	Drop first
		INSERT INTO TempOut VALUES (No, 'ALTER TABLE ' || d.Table_Name 
			|| ' DROP CONSTRAINT ' || d.Constraint_Name || ';');
		--	Create then
		INSERT INTO TempOut VALUES (No+500, d.Cmd || ';');
		No := No + 1;
	END LOOP;

	/**
	 *	Create List of Columns
	 */
	v_Line := '';
	FOR c IN CUR_Col LOOP
		IF (LENGTH(v_Line) > 0) THEN
			v_Line := v_Line || ',' || InitCap(c.Column_Name);
	   	ELSE
			v_Line := v_Line || InitCap(c.Column_Name);
	   	END IF;
	END LOOP;

	/**
	 *	Output
	 */
	INSERT INTO TempOut VALUES (100, '-- 2 -- Create/Copy');
	--	Copy into temp table
	INSERT INTO TempOut VALUES (101, 'CREATE TABLE ' || p_TableName || '_TT AS SELECT * FROM ' 
		|| p_TableName || ';'); 
	INSERT INTO TempOut VALUES (102, 'SELECT COUNT(*) FROM ' || p_TableName || '_TT;');
	--	Drop original table
	INSERT INTO TempOut VALUES (103, 'DROP TABLE ' || p_TableName || ' CASCADE CONSTRAINTS;');
	--	Create new Table (not generated)
	INSERT INTO TempOut VALUES (150, '-- 3 -- New Table');
	INSERT INTO TempOut VALUES (151, '-- >> CREATE TABLE HERE <<');
	--	Insert data
	INSERT INTO TempOut VALUES (200, '-- 4 -- Copy');
	INSERT INTO TempOut VALUES (201, 'INSERT INTO ' || p_TableName || ' (' || v_Line || ')');
	INSERT INTO TempOut VALUES (202, 'SELECT ' || v_Line || ' FROM ' || p_TableName || '_TT;');
	INSERT INTO TempOut VALUES (203, 'SELECT COUNT(*) FROM ' || p_TableName || ';');
	INSERT INTO TempOut VALUES (300, '-- 5 -- Finish');
	--	Drop temp table
	INSERT INTO TempOut VALUES (999, '-- DROP TABLE ' || p_TableName || '_TT;');
END;
/
SELECT Text FROM TempOut ORDER BY Line
/
DROP TABLE TempOut
/