본문 바로가기
개발자의 삶/DB

[오라클] DB 관련 문서(엔티티/테이블 정의서, 테이블 목록 등) 작성

by 나.R.D.(Rule Destoryer) 2019. 10. 14.
산출물은 양식이 있는 것은 아니지만, 어딜가나 뽑는 데이터는 비슷한 것 같다.
엔티티 정의서나 테이블 정의서에 경우, 거의 뽑는 데이터가 비슷하기 때문에 한꺼번에 다 뽑아서 해도 상관 없다.
때에 따라 테이블 크기, 초기 사이즈, 크기를 얼만큼씩 증가 시킬 것인지 등등을 뽑는 경우도 있는데, 그러한 정보들은 그때 다시 뽑고나서 작성하는 것으로...

# 테이블 목록 조회

SELECT CASE WHEN INSTR(A.TABLE_NAME,'_CM_') > 0
                THEN '공통'
        END 구분
      ,A.TABLE_NAME 테이블명
      ,B.COMMENTS 코멘트
  FROM USER_TABLES A
 INNER JOIN USER_TAB_COMMENTS B
    ON A.TABLE_NAME = B.TABLE_NAME
   AND A.TABLE_NAME LIKE 'T_%' -- 정상적인 테이블 네이밍룰
   AND INSTR(A.TABLE_NAME,'TMP') = 0 -- 테이블 목록 중에 불필요한 테이블을 걸러주기 위한 조건, 각 환경에 따라 불필요하거나 다른 조건이 필요할 수 있다.
   AND INSTR(A.TABLE_NAME,'TEMP') = 0
   AND INSTR(A.TABLE_NAME,'TEST') = 0
   AND INSTR(A.TABLE_NAME,'BAK') = 0
 ORDER BY A.TABLE_NAME

 

# 엔티티 정의서

-- 엔티티정의서
SELECT
    --a.table_name     AS 테이블명,
    a.tab_cmt        AS 테이블설명,
    --a.column_name    AS 컬럼명,
    a.col_cmt        AS 컬럼설명,
    --a.data_type      AS 데이터유형,
    CASE WHEN INSTR(a.data_type,'CHAR') > 0
                THEN 'C'
            WHEN INSTR(a.data_type,'NUM') > 0
                THEN 'N'
            WHEN INSTR(a.data_type,'DATE') > 0 OR INSTR(a.data_type,'TIME') > 0
                THEN 'D'
        END AS 데이터유형,
    a.DATA_LENGTH    AS 데이터길이,
    a.nullable       AS null여부,
    b.pos            AS PK
    --,a.column_id      AS 컬럼순서,
    --a.data_default   AS 기본값
FROM
    (
        SELECT
            s1.table_name,
            s3.comments   AS tab_cmt,
            s1.column_name,
            s2.comments   AS col_cmt,
            s1.data_type,
            CASE
                WHEN s1.data_precision IS NOT NULL THEN
                    data_precision
                    || ','
                    || data_scale
                ELSE
                    to_char(s1.data_length)
            END AS DATA_LENGTH,
            nullable,
            column_id,
            data_default
        FROM
            user_tab_columns    s1,
            user_col_comments   s2,
            user_tab_comments   s3
        WHERE
            s1.table_name = s2.table_name
            AND s1.column_name = s2.column_name
            AND s2.table_name = s3.table_name
            AND S1.TABLE_NAME in (
			-- 1.에서 뽑은 테이블 목록
    )
    ) a,
    (
        SELECT
            t1.table_name,
            t2.column_name,
            'PK' || position AS pos
        FROM
            (
                SELECT
                    table_name,
                    constraint_name
                FROM
                    user_constraints
                WHERE
                    constraint_type = 'P'
            ) t1,
            (
                SELECT
                    table_name,
                    constraint_name,
                    column_name,
                    position
                FROM
                    user_cons_columns
            ) t2
        WHERE
            t1.table_name = t2.table_name
            AND t1.constraint_name = t2.constraint_name
    ) b
WHERE
    a.table_name = b.table_name (+)
    AND a.column_name = b.column_name (+)
ORDER BY
    a.table_name,
    a.column_id

# 테이블 정의서

-- 테이블정의서
SELECT
    a.table_name     AS 테이블명,
    --a.tab_cmt        AS 테이블설명,
    a.column_name    AS 컬럼명,
    b.pos            AS PK,
    a.data_type      AS 데이터유형,
    a.DATA_LENGTH    AS 데이터길이,
    a.nullable       AS null여부,
    --,a.column_id      AS 컬럼순서,
    a.data_default   AS 기본값,
    a.col_cmt        AS 컬럼설명
FROM
    (
        SELECT
            s1.table_name,
            s3.comments   AS tab_cmt,
            s1.column_name,
            s2.comments   AS col_cmt,
            s1.data_type,
            CASE
                WHEN s1.data_precision IS NOT NULL THEN
                    data_precision
                    || ','
                    || data_scale
                ELSE
                    to_char(s1.data_length)
            END AS DATA_LENGTH,
            nullable,
            column_id,
            data_default
        FROM
            user_tab_columns    s1,
            user_col_comments   s2,
            user_tab_comments   s3
        WHERE
            s1.table_name = s2.table_name
            AND s1.column_name = s2.column_name
            AND s2.table_name = s3.table_name
            AND S1.TABLE_NAME in (
				-- 1.에서 뽑은 테이블 목록
    )
    ) a,
    (
        SELECT
            t1.table_name,
            t2.column_name,
            'PK' || position AS pos
        FROM
            (
                SELECT
                    table_name,
                    constraint_name
                FROM
                    user_constraints
                WHERE
                    constraint_type = 'P'
            ) t1,
            (
                SELECT
                    table_name,
                    constraint_name,
                    column_name,
                    position
                FROM
                    user_cons_columns
            ) t2
        WHERE
            t1.table_name = t2.table_name
            AND t1.constraint_name = t2.constraint_name
    ) b
WHERE
    a.table_name = b.table_name (+)
    AND a.column_name = b.column_name (+)
ORDER BY
    a.table_name,
    a.column_id
반응형

댓글