본문 바로가기

전산Tip/SAS

[SAS] 필드의 max length를 구하여 실제 length로 변경하여 적재

반응형

%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