DB 테이블 컬럼정보 조회

올로시아·2023년 10월 2일
0

코드 한땀

목록 보기
3/16

지난 시간에는 올로시아 코드 한땀 서비스에서 지원하는 입력유형을 안내해드렸는데요.

오늘은 입력유형 중 DB 테이블 컬럼정보를 이용하는 방법에 대해 말씀드리려고 합니다.

코드 한땀 서비스 페이지 하단부의 Columns 탭을 선택하시면 위와 같은 화면을 보실 수 있습니다.

각 Database 종류별로 DB 테이블 컬럼정보를 조회하는 쿼리를 제공하고 있습니다.

옵션 항목 중 table-name 이라는 input 항목에 조회하실 테이블명을 입력하시면 위 쿼리 중 'olosia_com' 으로 들어간 값이 대체됩니다.

지금은 MySQL, PostgreSQL, Oracle 세가지에 대해 제공하고 있는데요.

하나씩 살펴보겠습니다.

MySQL

SELECT C.COLUMN_NAME,
       C.COLUMN_TYPE,
       C.COLUMN_COMMENT
 /* ,
       CASE WHEN C.IS_NULLABLE = 'NO' THEN 'N' ELSE 'Y' END NULL_YN,
       CASE WHEN C.COLUMN_KEY = 'PRI' THEN 'Y' ELSE 'N' END PK_YN */
  FROM INFORMATION_SCHEMA.TABLES T
       LEFT JOIN INFORMATION_SCHEMA.COLUMNS C
              ON T.TABLE_NAME = C.TABLE_NAME
 WHERE 1 = 1
/* AND T.TABLE_SCHEMA = 'TABLE_SCHEMA' */
   AND T.TABLE_NAME   = 'olosia_com'
 ORDER BY C.ORDINAL_POSITION;

PostgreSQL

SELECT PA.ATTNAME AS COLUMN_NAME,
       (CASE WHEN IC.CHARACTER_MAXIMUM_LENGTH > 0 
                     THEN IC.UDT_NAME || '(' || IC.CHARACTER_MAXIMUM_LENGTH || ')'
                 ELSE IC.UDT_NAME
         END) AS COLUMN_TYPE,
       PD.DESCRIPTION AS COLUMN_COMMENT
 /* ,
       (CASE WHEN IC.IS_NULLABLE = 'YES' THEN 'Y' ELSE 'N' END) AS NULL_YN,
       (CASE WHEN (   SELECT CC.COLUMN_NAME
						FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
                        JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS CC
                              ON CC.TABLE_CATALOG = TC.TABLE_CATALOG
                             AND CC.TABLE_SCHEMA = TC.TABLE_SCHEMA
                             AND CC.TABLE_NAME = TC.TABLE_NAME
                             AND CC.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
                             AND TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
                       WHERE TC.TABLE_CATALOG = IC.TABLE_CATALOG
                         AND TC.TABLE_NAME = IC.TABLE_NAME
                         AND CC.COLUMN_NAME = IC.COLUMN_NAME
                   ) = IC.COLUMN_NAME THEN 'Y' ELSE 'N'
         END) AS PK_YN */
  FROM PG_STAT_ALL_TABLES AS PT
      JOIN PG_DESCRIPTION AS PD 
           ON PD.OBJOID = PT.RELID AND PD.OBJSUBID <> 0
      JOIN PG_ATTRIBUTE AS PA 
           ON PA.ATTRELID = PD.OBJOID AND PA.ATTNUM = PD.OBJSUBID
      JOIN INFORMATION_SCHEMA.COLUMNS AS IC 
           ON IC.TABLE_SCHEMA = PT.SCHEMANAME AND IC.TABLE_NAME = PT.RELNAME AND IC.COLUMN_NAME = PA.ATTNAME
 WHERE 1 = 1
/* AND IC.TABLE_CATALOG = 'postgres'
   AND PT.SCHEMANAME = 'public' */
   AND PT.RELNAME = 'olosia_com'
 ORDER BY PT.RELNAME, PD.OBJSUBID;

Oracle

SELECT C.COLUMN_NAME,
       C.DATA_TYPE AS COLUMN_TYPE,
       (SELECT T.COMMENTS
          FROM ALL_COL_COMMENTS T
         WHERE T.OWNER = C.OWNER
           AND T.TABLE_NAME = C.TABLE_NAME
           AND T.COLUMN_NAME = C.COLUMN_NAME) AS COLUMN_COMMENT
 /* ,
       B.DATA_TYPE || CASE
                          WHEN B.DATA_PRECISION IS NOT NULL
                          THEN
                             '(' || B.DATA_PRECISION || ',' || B.DATA_SCALE || ')'
                          ELSE
                             '(' || B.DATA_LENGTH || ')'
                       END AS COLUMN_TYPE,
        DECODE(B.NULLABLE, 'Y', 'Y', 'N') AS NULL_YN,
        DECODE((SELECT 'PK'
           FROM ALL_CONSTRAINTS X, ALL_CONS_COLUMNS Y
          WHERE X.OWNER = Y.OWNER
            AND X.TABLE_NAME = Y.TABLE_NAME
            AND X.CONSTRAINT_NAME = Y.CONSTRAINT_NAME
            AND X.CONSTRAINT_TYPE = 'P'
            AND Y.OWNER = B.OWNER
            AND Y.TABLE_NAME = B.TABLE_NAME
            AND Y.COLUMN_NAME = B.COLUMN_NAME), 'PK', 'Y', 'N')
           AS PK_YN */
  FROM ALL_TABLES A, ALL_TAB_COLUMNS C
 WHERE A.OWNER = C.OWNER
   AND A.TABLE_NAME = C.TABLE_NAME
/* AND A.OWNER = 'OWNER' */
   AND A.TABLE_NAME = 'olosia_com'
 ORDER BY A.OWNER, A.TABLE_NAME, C.COLUMN_ID;

위와 같은 쿼리문을 통해 아래와 같은 COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT 정보를 조회 할 수 있습니다.

이렇게 조회된 Tab 으로 구분된 컬럼정보를 복사해서, 코드 한땀의 컬럼정보 입력란에 붙여넣어 사용하시면 됩니다.

MySQL에서 제공하는 컬럼정보를 기반으로 시작하다 보니, 다른 DB는 쿼리가 조금 복잡해보이는군요.

테이블 정의서 Excel을 작성해야 하는 경우에도 이와같은 쿼리를 이용하실텐데요.

위 쿼리문에서 주석처리해둔 NULL_YN, PK_YN 정보도 참고하셔서 활용하시면 될것 같습니다.

저도 조각코드 작성에 ULL_YN, PK_YN 정보까지 추가해볼까 하다가... 필요이상으로 복잡해지는것 같아 우선 제외한 상태입니다.

그리고 제가 추가해둔 3가지 이외에 다른 DB 도 많이 사용하고 계신데요.

댓글로 쿼리문 알려주시면 추가하도록 하겠습니다.

감사합니다.

올로시아 코드 한땀 서비스 바로가기

profile
실패하는게 두려운게 아니라, 노력하지 않은게 두렵다. [마이클 조던]

0개의 댓글