반응형
딕셔너리 뷰를 이용해서 특정 스키마에 있는 테이블들의
명세를 추출할 수 있다.
※ 테이블 정보 추출은 ALL_TABLES, ALL_TAB_COLS, ALL_TAB_COMMENTS, ALL_COL_COMMENTS
제약조건 추출은 ALL_CONSTRAINTS, ALL_CONS_COLUMNS을 이용한다. (제약조건은 PRIMARY KEY만 추출)
/* SCOTT 스키마의 테이블 정보 조회 */
SELECT A.OWNER
, A.TABLE_NAME
, C.COMMENTS
, B.COLUMN_NAME
, D.COMMENTS
, B.DATA_TYPE
, B.DATA_LENGTH
, B.DATA_PRECISION
, B.DATA_SCALE
, B.NULLABLE
FROM ALL_TABLES A
, ALL_TAB_COLS B
, ALL_TAB_COMMENTS C
, ALL_COL_COMMENTS D
WHERE A.DROPPED = 'NO' --삭제된 테이블 제외
AND A.OWNER = 'SCOTT' --스키마 입력
AND B.HIDDEN_COLUMN = 'NO' --히든컬럼 제외
AND B.OWNER = A.OWNER
AND B.TABLE_NAME = A.TABLE_NAME
AND C.OWNER = B.OWNER
AND C.TABLE_NAME = B.TABLE_NAME
AND D.OWNER = B.OWNER
AND D.TABLE_NAME = B.TABLE_NAME
AND D.COLUMN_NAME = B.COLUMN_NAME;
/* SCOTT 스키마의 제약조건 조회 */
SELECT A.OWNER
, A.TABLE_NAME
, A.CONSTRAINT_NAME
, B.COLUMN_NAME
, B.POSITION
FROM ALL_CONSTRAINTS A
, ALL_CONS_COLUMNS B
WHERE 1=1
AND A.OWNER = 'SCOTT' --스키마 입력
AND A.CONSTRAINT_TYPE IN ('R','P') --R:FK, P:PK
AND B.OWNER = A.OWNER
AND B.CONSTRAINT_NAME = A.CONSTRAINT_NAME;
위와 같이 쿼리를 구성하고, 두개를 JOIN으로 합치면 쿼리는 완성된다.
단, 두 쿼리는 컬럼 레벨로 조회하는 쿼리이며, 제약조건 조회 쿼리와 JOIN시 OUTER JOIN을 활용하여야 한다.
SELECT A.OWNER AS "OWNER"
, A.TABLE_NAME AS "TABLE_NAME"
, C.COMMENTS AS "TABLE_COMMENTS"
, B.COLUMN_NAME AS "COLUMN_NAME"
, D.COMMENTS AS "COLUMN_COMMENTS"
, B.DATA_TYPE AS "DATA_TYPE"
, CASE WHEN B.DATA_TYPE = 'NUMBER' AND B.DATA_PRECISION IS NOT NULL THEN B.DATA_PRECISION||','||B.DATA_SCALE
ELSE TO_CHAR(B.DATA_LENGTH)
END AS "DATA_LEGNTH"
, DECODE(B.NULLABLE,'N','NOT NULL','NULL') AS "NULLABLE"
, E.CONSTRAINT_NAME AS "CONSTRAINT_NAME"
, CASE WHEN E.CONSTRAINT_NAME IS NOT NULL THEN 'PK' ELSE NULL END AS "PK"
FROM ALL_TABLES A
, ALL_TAB_COLS B
, ALL_TAB_COMMENTS C
, ALL_COL_COMMENTS D
, (SELECT A.OWNER
, A.TABLE_NAME
, A.CONSTRAINT_NAME
, B.COLUMN_NAME
, B.POSITION
FROM ALL_CONSTRAINTS A
, ALL_CONS_COLUMNS B
WHERE 1=1
AND A.OWNER = 'SCOTT' --스키마 입력
AND A.CONSTRAINT_TYPE = 'P' --제약조건 타입이 PRIMARY KEY
AND B.OWNER = A.OWNER
AND B.CONSTRAINT_NAME = A.CONSTRAINT_NAME) E
WHERE A.DROPPED = 'NO' --삭제된 테이블 제외
AND A.OWNER = 'SCOTT' --스키마 입력
AND B.HIDDEN_COLUMN = 'NO' --히든컬럼 제외
AND B.OWNER = A.OWNER
AND B.TABLE_NAME = A.TABLE_NAME
AND C.OWNER = B.OWNER
AND C.TABLE_NAME = B.TABLE_NAME
AND D.OWNER = B.OWNER
AND D.TABLE_NAME = B.TABLE_NAME
AND D.COLUMN_NAME = B.COLUMN_NAME
AND E.OWNER(+) = B.OWNER
AND E.TABLE_NAME(+) = B.TABLE_NAME
AND E.COLUMN_NAME(+) = B.COLUMN_NAME
ORDER BY A.OWNER
, B.TABLE_NAME
, B.COLUMN_ID ASC
조인 후, SELECT 리스트에서 적당하게 원하는 값으로 보여지게 가공하면 테이블 명세서를 간단하게 작성할 수 있다.
반응형
'데이터베이스 > ORACLE' 카테고리의 다른 글
[ORACLE/오라클] 계층형 쿼리를 이용한 트리구조 데이터 정렬하기 (0) | 2023.10.31 |
---|---|
[ORACLE/오라클] 딕셔너리 뷰를 이용해 SELECT문 만들기 (1) | 2023.05.14 |
[ORACLE/오라클] 날짜 테이블, 달력 테이블 만들기 (0) | 2023.05.05 |
[ORACLE/오라클] 유저 생성과 권한 (0) | 2023.05.01 |
[ORACLE/오라클] WINDOW 환경에서 SCOTT계정 생성 (0) | 2023.04.13 |