새싹 DBA/Scripts

테이블 DDL 추출 스크립트

LIMMI 2024. 7. 22. 18:15

테이블 DDL 추출 스크립트

SET SERVEROUTPUT ON;

DECLARE
	CURSOR c_tables IS
    /***********DDL 추출 대상 테이블 수정 ***********/
    	SELECT TABLE_NAME
             , OWNER
          FROM DBA_TABLES
         WHERE OWNER = 'IGWOWN'
           AND TABLE_NAME LIKE 'BC_AFBZ_OR_C';
   /************************************************/
   
   v_ddl CLOB;
   
 BEGIN
 	dbms_metadata.set_transform_param(dbms_metadata.session_transform,'STORAGE',false);
    dbms_metadata.set_transform_param(dbms_metadata.session_transform,'TABLESPACE',true);
    dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SEGMENT_ATTRIBUTES',true);
    dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SQLTERMINATOR',true);
    dbms_metadata.set_transform_param(dbms_metadata.session_transform,'PRETTY',true);
    dbms_metadata.set_transform_param(dbms_metadata.session_transform,'BODY',false);
    dbms_metadata.set_transform_param(dbms_metadata.session_transform,'CONSTRAINTS',true);
    dbms_metadata.set_transform_param(dbms_metadata.session_transform,'PARTITIONING',true);
    
    FOR r_table IN c_tables LOOP
    	v_ddl := v_ddl || '/******** [ START DDL for ' || r_table.table_name ||' ] *********/';
        v_ddl := v_ddl || CHR(10) || '-- 1.TABLE(PK INDEX 및 CONSTRAINT 포함)' || dbms_metadata.get_ddl('TABLE',r_table.table_name, r_table.owner);
        v_ddl := v_ddl || CHR(10) || CHR(10) || '-- 2.INDEX(PK INDEX 외)' ;
        
        FOR r_index IN (SELECT INDEX_NAME
                          FROM DBA_INDEXES
                         WHERE TABLE_NAME = r.table.table_name
                           AND TABLE_OWNER = r_table.owner 
                           AND INDEX_NAME NOT LIKE 'PK%' LOOP
        	BEGIN v_ddl := || dbms_metadata.get_ddl('INDEX',r_index.index_name, r_table.owner);
            	EXCEPTION
                	WHEN OTHERS THEN
                    	NULL;
            END;
        END LOOP; 
        
        v_ddl := v_ddl || CHR(10) || CHR(10) || '-- 3.COMMENT' || dbms_metadata.get_dependent_ddl('COMMENT','r_table.table_name, r_table.owner);
        v_ddl := v_ddl || CHR(10) || CHR(10) || '-- 4.GRANT' || dbms_metadata.get_dependent_ddl('OBJECT_GRANT',r_table.table_name,r_table.owner);
        v_ddl := CHR(10) || '/*************[END DDL for ' || r_table.table_name || ' ] ***********/' || CHR(10) || CHR(10);
        
        dbms_output.put_line(v_ddl);
        
    END LOOP;
 END;