%MACRO ORA_TBL_DOWNLOAD_2(TBL);
PROC SQL;
CREATE TABLE COLS AS
SELECT *
FROM DICTIONARY.COLUMNS
WHERE LIBNAME = UPCASE("ORA")
AND MEMNAME = UPCASE("&TBL")
ORDER BY VARNUM
;
QUIT;
DATA COLS2;
SET COLS;
IF TYPE='char';
RUN;
DATA _NULL_;
SET COLS2 END=EOF NOBS=TCNT;
CALL SYMPUT('VARNAME'||LEFT(_N_), COMPRESS(NAME));
IF EOF THEN CALL SYMPUT('TCNT', COMPRESS(TCNT));
RUN;
%PUT TCNT IS &TCNT;
PROC SQL;
CREATE TABLE COLS3 AS
SELECT %DO I = 1 %TO &TCNT;
%IF &I ^= 1 %THEN %DO;, %END; MAX(LENGTH(&&VARNAME&I)) AS &&VARNAME&I
%END;
FROM ORA.&TBL
;
QUIT;
PROC TRANSPOSE
DATA=COLS3
OUT=COLS4
;
RUN;
PROC SQL;
CREATE TABLE COLS5 AS
SELECT A.LIBNAME
, A.MEMNAME
, A.NAME
, A.TYPE
, CASE WHEN B._NAME_ IS NOT NULL THEN 1 ELSE 0 END AS LEN_YN
, B.COL1 AS LEN
, A.VARNUM
FROM COLS AS A
LEFT OUTER JOIN
COLS4 AS B
ON A.NAME = B._NAME_
ORDER BY VARNUM
;
QUIT;
DATA _NULL_;
SET COLS5 END=EOF NOBS=TCNT;
CALL SYMPUT('VARNAME'||LEFT(_N_), COMPRESS(NAME));
CALL SYMPUT('YN'||LEFT(_N_), COMPRESS(LEN_YN));
CALL SYMPUT('LEN'||LEFT(_N_), COMPRESS(LEN));
IF EOF THEN CALL SYMPUT('TCNT', COMPRESS(TCNT));
RUN;
%PUT TCNT IS &TCNT;
PROC SQL;
CREATE TABLE IR_ETL.&TBL AS
SELECT %DO I = 1 %TO &TCNT;
%IF &I ^= 1 %THEN %DO;, %END; &&VARNAME&I %IF &&YN&I = 1 %THEN %DO; LENGTH=&&LEN&I INFORMAT=$&&LEN&I... FORMAT=$&&LEN&I... %END;
%END;
FROM ORA.&TBL
;
QUIT;
%MEND;
'전산Tip > SAS' 카테고리의 다른 글
[SAS] array로 missing 처리 (159) | 2011.04.08 |
---|---|
[SAS] 디시전트리 룰 추출 쿼리 (1) | 2011.02.25 |
[SAS] spawn 설정 (win NT) (0) | 2011.02.25 |