새싹 DBA/Scripts

[PL/SQL] DBLINK 사용 IMPDP 테이블 이관 프로시저

LIMMI 2024. 7. 23. 17:59

오라클 DBLINK 사용 IMPDP 테이블 이관 프로시저

NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
CREATE OR REPLACE PROCEDURE PRC_IMPDP(
    P_OWNER IN VARCHAR DEFAULT NULL
   ,P_TABLE IN VARCHAR DEFAULT NULL)
   
IS
--1.1 DB 링크를 이용하여 복사
dph NUMBER;
v_job_name VARCHAR(100) := 'IMPDP_DIGWDB_'||TO_CHAR(SYSDATE,'YYYYMMDD_HH24MISS');
v_mdy_tab_list varchar(32767)
BEGIN
IF P_TABLE IS NULL THEN
    /* 수정된 테이블 조회 */
    SELECT ''''||tab_list||'''' INTO v_mdy_tab_list
      FROM (
          SELECT LISTAGG(tABLE_NAME,''',''') WITHIN GROUP(ORDER BY TABLE_NAME) tab_list
          FROM (
              SELECT OBJECT_OWNER||','||OBJECT_NAME AS TABLE_NAME
              FROM TB_DDL_HISTORY@DL_DIGWDB_DBADM
             WHERE EXEC_DTM BETWWNE TO_DATE(TO_CHAR(SYSDATE,'YYYYMMDD')||' 000000','YYYYMMDD HH24MISS') AND SYSDATE 
               AND OBJECT_OWNER IN ('IGWOWN''MBMS')
               AND REGEXP_LIKE(OBJECT_NAME, '[^0-9]$')
             GROUP BY OBJECT_OWNER, OBJECT_NAME
             )
          );
ELSE
    SELECT ''''||P_TABLE||'''' into v_mdy_tab_list
      FROM DUAL;
END IF;
      
/*DB_LINK 이용 */
     
    dph := DBMS_DATAPUMP.OPEN( operation => 'IMPORT'
                             , job_mod => 'SCHEMA'
                             , job_name => v_job_name
                             , remote_link => 'DL_DIGWDB_DBADM');
/*로그*/
    
    dbms_datapump.add_file(handle => dph,
                           filename => v_job_name ||'.log',
                           directory => 'DATA_PUMP_DIR', filetype=>3);
-- 스키마정보
    dbms_datapump.METADATA_FILTER(handle => dph,
                           name => 'SCHEMA_EXPR',
                           value => ' IN ('''||P_OWNER||''')');
      
--테이블 존재시 TRUNCATE/REPLACE/APPEND
    
    dbms_datapump.set_parameter(handle => dph,
                           name => 'TABLE_EXISTS_ACTION',
                           value => 'REPLACE');
                           
--테이블 정보
    
    dbms_datapump.METADATA_FILTER(handle => dph,
                           name => 'INCLUDE_PATH_EXPR',
                           value => ' IN ('||v_mdy_tab_list||')',
                           object_type => 'TABLE');
--테이블 정보
    dbms_datapump.METADATA_FILTER(handle => dph,
                           name => 'INCLUDE_PATH_EXPR',
                           value => ' IN (''TABLE'')');
--테이블 정보
    
    dbms_datapump.METADATA_FILTER(handle => dph,
                           name => 'EXCLUDE_PATH_EXPR',
                           value => ' IN (''INDEX'',''GRANTS'',''STATISTICS'')');
                           
dbms_datapump.start_job(dph);
dbms_datapump.detach(dph);
EXCEPTION
    WHEN OTHERS THEN
        dbms_output.put_line('Error:' ||sqlerrm || ' on JOB-ID:' || dph);
END;
/
cs