-- 오라클 테이블정의서추출 SQL

WITH LIST AS
(
    SELECT A.TABLE_NAME,
        C.COMMENTS AS TABLE_COMMENT,
        A.COLUMN_ID,
           A.COLUMN_NAME,
           A.DATA_TYPE,
           A.DATA_LENGTH,
           DECODE(A.NULLABLE,'N','NOT NULL','') AS NULLABLE,
           B.COMMENTS AS COLUMN_COMMENT
          , CASE WHEN (SELECT COUNT(*)
            FROM DBA_CONSTRAINTS AA
               , DBA_CONS_COLUMNS BB
           WHERE AA.OWNER = BB.OWNER
             AND AA.TABLE_NAME = BB.TABLE_NAME
             AND AA.CONSTRAINT_NAME =BB.CONSTRAINT_NAME
             AND AA.OWNER = A.OWNER
             AND AA.TABLE_NAME =A.TABLE_NAME
             AND BB.OWNER=A.OWNER
             AND BB.TABLE_NAME=A.TABLE_NAME
             AND BB.COLUMN_NAME=A.COLUMN_NAME
             AND AA.CONSTRAINT_TYPE = 'P'
             AND POSITION IS NOT NULL) >0 THEN 'Y' ELSE '' END  AS PK
     , CASE WHEN (SELECT COUNT(*)
                FROM DBA_CONSTRAINTS AA
                   , DBA_CONS_COLUMNS BB
               WHERE AA.OWNER = BB.OWNER
                 AND AA.TABLE_NAME = BB.TABLE_NAME
                 AND AA.CONSTRAINT_NAME =BB.CONSTRAINT_NAME
                 AND AA.OWNER = A.OWNER
                 AND AA.TABLE_NAME =A.TABLE_NAME
                 AND BB.OWNER=A.OWNER
                 AND BB.TABLE_NAME=A.TABLE_NAME
                 AND BB.COLUMN_NAME=A.COLUMN_NAME
                 AND AA.CONSTRAINT_TYPE = 'R'
                 AND POSITION IS NOT NULL) >0 THEN 'Y' ELSE '' END AS FK
--       , DECODE(E.INDEX_NAME,NULL,'',E.INDEX_NAME ||' (' || E.COLUMN_NAME || ')') AS IDX
         , E.INDEX_NAME AS IDX
    FROM   dba_tab_columns A,
           all_col_comments B,
           DBA_TAB_COMMENTS C,
   ALL_IND_COLUMNS E
    WHERE  A.OWNER = B.OWNER
    AND    A.TABLE_NAME = B.TABLE_NAME
    AND    A.COLUMN_NAME = B.COLUMN_NAME
AND    A.OWNER       = C.OWNER(+)
AND    A.TABLE_NAME  = C.TABLE_NAME(+)
AND    A.OWNER       = E.Table_OWNER(+)
AND    A.TABLE_NAME  = E.TABLE_NAME(+)
AND    A.COLUMN_NAME = E.COLUMN_NAME(+)
    AND    A.OWNER = 'DB사용자명'   -- DB 사용자명
),
PKLIST AS
(
    SELECT C.TABLE_NAME,
           C.COLUMN_NAME,
           C.POSITION
    FROM USER_CONS_COLUMNS C,
         USER_CONSTRAINTS S
    WHERE C.CONSTRAINT_NAME = S.CONSTRAINT_NAME
    AND S.CONSTRAINT_TYPE = 'P'
)
SELECT L.TABLE_NAME AS "TABLE_NAME",
   L.TABLE_COMMENT AS "TABLE_COMMENT",
   L.COLUMN_ID AS "NO",
       L.COLUMN_COMMENT AS "COLUMN_COMMENT",
       L.COLUMN_NAME AS "COLUMN_NAME",
       L.DATA_TYPE AS "DATA_TYPE",
       L.DATA_LENGTH AS "SIZE",
       L.NULLABLE AS "NULLABLE",
       L.PK AS "PK",
       L.FK AS "FK",
       L.IDX AS "IDX"
FROM LIST L,
     PKLIST P
WHERE L.TABLE_NAME = P.TABLE_NAME(+)
  AND L.COLUMN_NAME = P.COLUMN_NAME(+)
 ORDER BY L.TABLE_NAME,
          NVL(P.POSITION, 99)
;

'개발 > Oracle' 카테고리의 다른 글

DB 사용자명 조회 SQL  (0) 2022.07.28

+ Recent posts