본문 바로가기

oracle

[ORACLE] daily partition add procdure

728x90

간단한 데일리 파티션 추가 procdure 

ex>
partition name 형식 : PARTITION_TABLE1_PR_20220715(partition name 형태가 다를 경우 프로시져 수정 필요)
SQL>exec PARTITION_ADD('SCOTT','PARTITON_TABLE1','20231231'); --SCOTT.PARTITON_TABLE1 이라는 일일파티션테이블을 20231231까지 생성 

 

CREATE OR REPLACE PROCEDURE PARTITION_ADD(powner in varchar2,ptabnm in varchar2 , pMAXDT in varchar2)
IS

vMAX_DT DATE;
vSTMT VARCHAR2(1000);
vCNT NUMBER :=1;

BEGIN

    SELECT TO_DATE(SUBSTR(PARTITION_NAME,-8,8),'YYYYMMDD') AS MAX_DT
    into vMAX_DT
    FROM DBA_TAB_PARTITIONS A,
    (SELECT TABLE_OWNER,TABLE_NAME,MAX(PARTITION_POSITION) AS PARTITION_POSITION FROM DBA_TAB_PARTITIONS GROUP BY TABLE_OWNER,TABLE_NAME) B
    WHERE A.TABLE_OWNER=B.TABLE_OWNER
    AND A.TABLE_NAME=B.TABLE_NAME
    AND A.PARTITION_POSITION=B.PARTITION_POSITION    
    AND A.TABLE_OWNER=powner
    AND A.TABLE_NAME=ptabnm;
    
WHILE vMAX_DT+vcnt <= TO_DATE(pMAXDT,'YYYYMMDD')
LOOP
        vSTMT:= 'ALTER TABLE '||powner||'.'||ptabnm||' ADD PARTITION '||ptabnm||'_PR_'||TO_CHAR(vMAX_DT+vcnt,'YYYYMMDD')||' VALUES LESS THAN ('''||TO_CHAR(vMAX_DT+vcnt+1,'YYYYMMDD')||''') TABLESPACE STSMDC02DT';
        
    execute immediate vSTMT;
      vCNT:=vCNT+1;    
END LOOP;    

END;
/

728x90