먼저, 감사합니다. 앞에 질문사항에서 힌트를 주셔서 거의 해결했습니다.
마지막으로 한가지 더 질문드리겠습니다.
계층쿼리를 이용해서 밑에 있는 로우의 컬럼이름과 타입을 가져다가 테이블 생성 스크립트를 만들고 싶은데요..
돌려보면 아시겠지만, 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
)
하나의 ROW에 테이블 스크립트 전체를 넣겠다는 얘긴가...
SELECT TABLE_NAME
, 'CREATE TABLE ' || TABLE_NAME
|| '('
|| LISTAGG ( column_name || ' ' || target, ', ' ) WITHIN GROUP (ORDER BY COLUMN_ID)
|| ') ;'
FROM ( 위쿼리 ) GROUP BY table_name
네 맞습니다.. 모르는 함수가.. 많네요 ㅠㅠ
감사합니다. 계속고민하고 있었어요
LISTAGG (column_name || ' ' || target, ', ') WITHIN GROUP (ORDER BY COLUMN_ID)
이건 그럼 , 으로 구분한단뜻인가요?
ㅇㅇ
확인했습니다. 그냥 이어주려고 쓰신거네요..감사합니다 덕분에 새로운 함수 알아가요!
꽃미남이 밥 사는겨??