+/*$mw$*/
+CREATE OR REPLACE PROCEDURE duplicate_table(p_oldname IN VARCHAR2, p_newname IN VARCHAR2, p_temporary IN BOOLEAN)
+IS
+ v_oldname VARCHAR2(32) := RTRIM(LTRIM(p_oldname, '"'), '"');
+ v_newname VARCHAR2(32) := RTRIM(LTRIM(p_newname, '"'), '"');
+ v_prefix VARCHAR2(32) := SUBSTR(v_newname, 1, INSTR(v_newname, v_oldname, -1)-1);
+ e_table_not_exist EXCEPTION;
+ PRAGMA EXCEPTION_INIT(e_table_not_exist, -00942);
+BEGIN
+ BEGIN
+ EXECUTE IMMEDIATE 'DROP TABLE '||v_newname||' CASCADE CONSTRAINTS';
+ EXCEPTION WHEN e_table_not_exist THEN NULL; END;
+
+ IF (p_temporary) THEN
+ EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE '||v_newname||
+ ' AS SELECT * FROM '||v_oldname||' WHERE ROWNUM = 0';
+ ELSE
+ EXECUTE IMMEDIATE 'CREATE TABLE '||v_newname||
+ ' AS SELECT * FROM '||v_oldname||' WHERE ROWNUM = 0';
+ END IF;
+
+ FOR rc IN (SELECT column_name, data_default
+ FROM user_tab_columns
+ WHERE table_name = v_oldname
+ AND data_default IS NOT NULL) LOOP
+ EXECUTE IMMEDIATE 'ALTER TABLE '||v_newname||' MODIFY '||rc.column_name||' DEFAULT '||substr(rc.data_default, 1, 2000);
+ END LOOP;
+
+ FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl ('CONSTRAINT', constraint_name), 32767, 1),
+ USER||'"."', USER||'"."'||v_prefix),
+ '"'||constraint_name||'"', '"'||v_prefix||constraint_name||'"') DDLVC2
+ , constraint_name
+ FROM user_constraints uc
+ WHERE table_name = v_oldname
+ AND constraint_type = 'P') LOOP
+ EXECUTE IMMEDIATE SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE')-1);
+ END LOOP;
+
+ FOR rc IN (SELECT REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl ('REF_CONSTRAINT', constraint_name), 32767, 1),
+ USER||'"."', USER||'"."'||v_prefix) DDLVC2
+ , constraint_name
+ FROM user_constraints uc
+ WHERE table_name = v_oldname
+ AND constraint_type = 'R') LOOP
+ EXECUTE IMMEDIATE rc.ddlvc2;
+ END LOOP;
+
+ FOR rc IN (SELECT REPLACE(REPLACE(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl ('INDEX', index_name), 32767, 1),
+ USER||'"."', USER||'"."'||v_prefix),
+ '"'||index_name||'"', '"'||v_prefix||index_name||'"') DDLVC2
+ , index_name
+ FROM user_indexes ui
+ WHERE table_name = v_oldname
+ AND index_type != 'LOB'
+ AND NOT EXISTS (SELECT NULL FROM user_constraints
+ WHERE table_name = ui.table_name
+ AND constraint_name = ui.index_name)) LOOP
+ EXECUTE IMMEDIATE SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'PCTFREE')-1);
+ END LOOP;
+
+ FOR rc IN (SELECT REPLACE(REPLACE(UPPER(DBMS_LOB.SUBSTR(DBMS_METADATA.get_ddl ('TRIGGER', trigger_name), 32767, 1)),
+ USER||'"."', USER||'"."'||v_prefix),
+ ' ON '||v_oldname, ' ON '||v_newname) DDLVC2
+ , trigger_name
+ FROM user_triggers
+ WHERE table_name = v_oldname) LOOP
+ EXECUTE IMMEDIATE SUBSTR(rc.ddlvc2, 1, INSTR(rc.ddlvc2, 'ALTER ')-1);
+ END LOOP;
+END;
+/*$mw$*/
+