예전에 테이블 컬럼 정보 조회 쿼리를 올린적이 있었는데....
이리저리 도움을 받아서 다시 정리했다.
음.. 이번거는 목적이 '테이블 정의서'라서....
조금 애매하기는 하다.
아래의 쿼리문을 그대로 돌리면 해당 유저의 스키마 테이블을 모두 조회한다.
아참.. 오라클 실행계획을 보면 LOOP가 굉장히 많고 시간도 조금 걸리는 문장이란걸 유념하자.
그리고 좀 길다...쩝...
SELECT (CASE WHEN MAIN.COLUMN_ID = 1 THEN MAIN.TABLE_COMMENTS
ELSE '' END) table_kor_name
, (CASE WHEN MAIN.COLUMN_ID = 1 THEN MAIN.TABLE_NAME
ELSE '' END ) table_eng_name
, MAIN.COLUMN_ID column_id
, MAIN.COLUMN_NAME column_name
, MAIN.COLUMN_COMMENTS column_comments
, (CASE SUB.CONSTRAINT_TYPE WHEN 'P'
THEN 'PK'
WHEN 'R'
THEN 'FK ('||SUB.FK_COLUNM||')' END) key_flag
, (CASE NVL(MAIN.NULL_FLAG, 'N') WHEN 'N'
THEN 'NOT NULL'
ELSE '' END) null_flag
, MAIN.DATA_TYPE data_type
, (CASE MAIN.DATA_TYPE WHEN 'NUMBER'
THEN (CASE WHEN MAIN.DATA_PRECISION IS NOT NULL
THEN TO_CHAR(MAIN.DATA_LENGTH)||' ('
||TO_CHAR(MAIN.DATA_PRECISION)||')' ELSE TO_CHAR(MAIN.DATA_LENGTH) END)
WHEN 'DATE'
THEN ''
ELSE TO_CHAR(MAIN.DATA_LENGTH) END) data_type_length
FROM (SELECT T_COMT.COMMENTS table_comments
, T_COLS.TABLE_NAME table_name
, C_COMT.COMMENTS column_comments
, T_COLS.COLUMN_NAME column_name
, (CASE T_COLS.NULLABLE WHEN 'Y' THEN 'Y' END) null_flag
, T_COLS.DATA_TYPE data_type
, T_COLS.DATA_LENGTH data_length
, T_COLS.COLUMN_ID column_id
, T_COLS.DATA_PRECISION data_precision
FROM USER_TAB_COLUMNS T_COLS
, USER_TAB_COMMENTS T_COMT
, USER_COL_COMMENTS C_COMT
WHERE T_COLS.TABLE_NAME = T_COMT.TABLE_NAME
AND T_COLS.TABLE_NAME = C_COMT.TABLE_NAME
AND T_COLS.COLUMN_NAME = C_COMT.COLUMN_NAME
AND T_COMT.TABLE_TYPE = 'TABLE'
) MAIN
, (SELECT CONST.CONSTRAINT_TYPE constraint_type
, CONST.TABLE_NAME table_name
, COLS.COLUMN_NAME column_name
, R_COLS.COLUMN_NAME fk_colunm
FROM USER_CONSTRAINTS CONST
, USER_CONS_COLUMNS COLS
, USER_CONS_COLUMNS R_COLS
WHERE CONST.CONSTRAINT_NAME = COLS.CONSTRAINT_NAME
AND CONST.CONSTRAINT_TYPE IN ('P', 'R')
AND CONST.R_CONSTRAINT_NAME = R_COLS.CONSTRAINT_NAME(+)
) SUB
WHERE MAIN.TABLE_NAME = SUB.TABLE_NAME(+)
AND MAIN.COLUMN_NAME = SUB.COLUMN_NAME(+)
--AND MAIN.TABLE_NAME = UPPER('TABLE_NAMES') /*특정 테이블 조회일 경우 사용.*/
ORDER BY MAIN.TABLE_NAME, MAIN.COLUMN_ID
;
헉...이거 신경써서 오와 열을 맞췄더니만....
미리보기 하니 다 깨지네...쩝.. 몰라....