DATA 전문가로 가는 길

[SQL] 오라클 테이블레이아웃 조회 쿼리 본문

Data Architecture/SQL Query

[SQL] 오라클 테이블레이아웃 조회 쿼리

EstenPark 2015. 2. 14. 06:28

오라클 데이터베이스에 특정 사용자에 접속해서 테이블 정보를 조회해야 하는 경우가 생기는데 USER_TAB_COLUMNS, USER_TAB_COMMENTS, USER_CONSTRAINTS 딕셔너리를 이용하여 테이블 레이아웃 형태와 같이 뽑을 수 있습니다.


SELECT    X.TABLE_NAME
         ,X.TABLE_COMMENTS
         ,X.COLUMN_NAME
         ,X.COLUMN_COMMENTS
         ,X.PK_FLAG
         ,X.FK_FLAG
         ,X.NULL_FLAG
         ,X.DATA_TYPE || X.DATA_LENGTH as COLUMN_DATA_TYPE
FROM      (SELECT    A1.TABLE_NAME TABLE_NAME
                    ,A1.TABLE_COMMENTS TABLE_COMMENTS
                    ,A1.COLUMN_NAME COLUMN_NAME
                    ,A1.COLUMN_COMMENTS COLUMN_COMMENTS
                    ,(CASE
                        WHEN B1.CONSTRAINT_TYPE = 'P' THEN 'Y'
                      END)
                       PK_FLAG
                    ,(CASE
                        WHEN B1.CONSTRAINT_TYPE = 'R' THEN 'Y'
                      END)
                       FK_FLAG
                    ,A1.NULL_FLAG
                    ,A1.DATA_TYPE
                    ,A1.DATA_LENGTH
                    ,A1.COLUMN_ID
           FROM      (SELECT    B.COMMENTS TABLE_COMMENTS
                               ,A.TABLE_NAME TABLE_NAME
                               ,C.COMMENTS COLUMN_COMMENTS
                               ,A.COLUMN_NAME COLUMN_NAME
                               ,(CASE A.NULLABLE
                                   WHEN 'Y' THEN 'Y'
                                 END)
                                  NULL_FLAG
                               ,A.DATA_TYPE DATA_TYPE
                               ,(CASE
                                   WHEN A.DATA_TYPE IN ('CHAR', 'VARCHAR2')
                                   THEN
                                     '(' || A.DATA_LENGTH || ')'
                                   WHEN A.DATA_TYPE = 'NUMBER'
                      AND               A.DATA_SCALE = 0
                      AND               A.DATA_PRECISION IS NOT NULL
                                   THEN
                                     '(' || A.DATA_PRECISION || ')'
                                   WHEN A.DATA_TYPE = 'NUMBER'
                      AND               A.DATA_SCALE <> 0
                                   THEN
                                     '(' || A.DATA_PRECISION || ',' || A.DATA_SCALE || ')'
                                 END)
                                  DATA_LENGTH
                               ,A.COLUMN_ID
                      FROM      USER_TAB_COLUMNS A
                               ,USER_TAB_COMMENTS B
                               ,USER_COL_COMMENTS C
                      WHERE     (A.TABLE_NAME = B.TABLE_NAME)
                      AND       (A.TABLE_NAME = C.TABLE_NAME
                      AND        A.COLUMN_NAME = C.COLUMN_NAME
--                     AND       A.TABLE_NAME like 'DIM%'  /* [조건] 원하는 테이블만 조회 한다. */
                                )) A1
                    ,(SELECT    A.TABLE_NAME, A.COLUMN_NAME, B.CONSTRAINT_TYPE
                      FROM      USER_CONS_COLUMNS A
                               ,USER_CONSTRAINTS B
                      WHERE     (A.CONSTRAINT_NAME = B.CONSTRAINT_NAME)
                      AND       B.CONSTRAINT_TYPE IN ('P', 'R')) B1
           WHERE     (A1.TABLE_NAME = B1.TABLE_NAME(+)
           AND        A1.COLUMN_NAME = B1.COLUMN_NAME(+))) X
ORDER BY  X.TABLE_NAME, X.COLUMN_ID


Comments