먼저, 감사합니다. 앞에 질문사항에서 힌트를 주셔서 거의 해결했습니다.
마지막으로 한가지 더 질문드리겠습니다.
계층쿼리를 이용해서 밑에 있는 로우의 컬럼이름과 타입을 가져다가 테이블 생성 스크립트를 만들고 싶은데요..
돌려보면 아시겠지만, rm이 1일경우 script 를 뽑게 되어 있습니다.
근데 지금 쿼리대로라면 각 행마다 실행이 되서요, rm1인 곳에서 모두 밑에 컬럼들도 뽑고 싶은데요.
조언 부탁드립니다.
SELECT
CASE
WHEN RM ='1' THEN TABLE_NAME ELSE '' END TABLE_NAME
, COLUMN_ID
, COLUMN_NAME
, DATA_TYPE
, DATA_LENGTH
, TARGET
, CASE
WHEN RM ='1' THEN 'CREATE TABLE'|| TABLE_NAME ||' ( '||COLUMN_NAME || ' (' || '),' ELSE '' END SCRIPT
FROM
(
SELECT TABLE_NAME
, COLUMN_ID
, COLUMN_NAME
, DATA_TYPE
, DATA_LENGTH
, CASE
-- 문자형
WHEN DATA_TYPE = 'VARCHAR2' AND DATA_LENGTH = '200' AND SUBSTR(TABLE_NAME,1,2) ='IF' THEN 'VARCHAR(255)'
WHEN DATA_TYPE = 'VARCHAR2' AND DATA_LENGTH > '256' THEN 'TEXT'
WHEN DATA_TYPE = 'VARCHAR2' AND DATA_LENGTH < '254' THEN 'VARCHAR('||DATA_LENGTH||')'
-- 날짜형
WHEN DATA_TYPE = 'DATE' THEN 'TIMESTAMP'
-- 숫자형
WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE 'LVL' THEN 'TINYINT'
WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE '%_LEVEL' THEN 'TINYINT'
WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE 'COLOR_SIGNAL_ID' THEN 'TINYINT'
WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE 'SUCCESS_QTY' THEN 'INT'
WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE 'FAIL_QTY' THEN 'INT'
WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE 'UPDATE_QTY' THEN 'INT'
WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE '%SEQ' THEN 'INT'
WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE '%_CNT' THEN 'INT'
WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE '%_QTY' THEN 'INT'
WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE '%RATIO' THEN 'FLOAT'
WHEN DATA_TYPE ='NUMBER' AND COLUMN_NAME LIKE '%RATE' THEN 'FLOAT'
ELSE 'BIGINT'
END TARGET
, ROW_NUMBER () OVER (PARTITION BY TABLE_NAME ORDER BY TABLE_NAME) RM
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME <> 'PLAN_TABLE'
AND TABLE_NAME <> 'PLSQL_ARCHIVE'
ORDER BY 1,2
)