티스토리 뷰

오라클에선 DBMS_METADATA.GET_DDL을 통해 테이블, 인덱스, 뷰, 유저, 프로시저 생성에 관한 Create DDL을 쉽게 추출할 수 있습니다. 해당 기능은 oracle 9i 이상부터 지원하고 있습니다.

사용 예제

1. 테이블 DDL 추출

-- SELECT DBMS_METADATA.GET_DDL('TABLE','TABLE 명') FROM DUAL;
SELECT DBMS_METADATA.GET_DDL('TABLE','EMPLOYEES') FROM DUAL;

 

2. 인덱스 DDL 추출

-- SELECT DBMS_METADATA.GET_DDL('INDEX','INDEX 명') FROM DUAL;
SELECT DBMS_METADATA.GET_DDL('INDEX','SYS_C007536') FROM DUAL;

 

테이블과 인덱스뿐만 아니라, 나머지 객체들도 위와 같은 방법으로 DDL 추출이 가능합니다. 따라서, 다음과 같이 정리할 수 있습니다.

-- SELECT DBMS_METADATA.GET_DDL('객체 유형','객체명') FROM DUAL;
SELECT DBMS_METADATA.GET_DDL('TABLE','테이블 명') FROM DUAL;
SELECT DBMS_METADATA.GET_DDL('INDEX','인덱스 명') FROM DUAL;
SELECT DBMS_METADATA.GET_DDL('VIEW','뷰 명') FROM DUAL;
SELECT DBMS_METADATA.GET_DDL('PROCEDURE','프로시저 명') FROM DUAL;
SELECT DBMS_METADATA.GET_DDL('TABLESPACE','테이블스페이스 명') FROM DUAL;
...

응용하기

DDL을 추출할 때 Storage나 자잘구리한 내용들을 깔끔하게 정리하고 싶을 땐 DBMS_METADATA.SET_TRANSFORM_PARAM을 사용하여 DBMS_METADATA.GET_DDL에서 추출되는 DDL의 형식을 조정할 수 있습니다.

DECLARE
    v_get_table_ddl      clob;
BEGIN
    dbms_metadata.set_transform_param(dbms_metadata.session_transform,'STORAGE',false); -- STORAGE에 대한 정보 표시 여부
    dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SEGMENT_ATTRIBUTES',true); -- table, index 등의 세그먼트 속성 표시 여부
    dbms_metadata.set_transform_param(dbms_metadata.session_transform,'SQLTERMINATOR',true); -- DDL 문장 끝에 세미콜론을 추가할건지 결정
    dbms_metadata.set_transform_param(dbms_metadata.session_transform,'PARTITIONING',true); -- 파티션 정보를 DDL에 포함할건지 여부
    dbms_metadata.set_transform_param(dbms_metadata.session_transform,'PRETTY',true); -- DDL을 읽을 사람이 보기 좋게 정렬해주는 옵션
    dbms_metadata.set_transform_param(dbms_metadata.session_transform,'CONSTRAINTS',false); -- 제약 조건 포함 여부 
    SELECT DBMS_METADATA.GET_DDL('TABLE','EMPLOYEES','ORA') INTO v_get_table_ddl  FROM DUAL;

    dbms_output.put_line(v_get_table_ddl);
END;

위에서 추출한 DDL 결과와 비교해서 보면 깔끔하게 정리된 것을 볼 수 있습니다.

최근에 올라온 글
Total
Today
Yesterday