본문 바로가기
데이터베이스/Postgresql

[PostgreSql] 파티션 자동 생성 프로시저

by cbwstar 2022. 6. 28.
728x90
반응형

PostgreSql에서 파티션 자동생성 프로시저 입니다. 오라클과 달리 PosrgreSql에서는 파티션을 나누면 그 자체가 서브 테이블로 생성이 됩니다. 서브테이블에 바로 인서트 해도 되고 서브테이블을 그냥 삭제 해 버리면 파티션도 자동으로 그냥 삭제 처리가 됩니다.

CREATE OR REPLACE PROCEDURE PROC_AUTO_PART_CREATE(
    OUT_RESULT_CD INOUT VARCHAR,
    OUT_SQLERR INOUT VARCHAR
)
	LANGUAGE plpgsql
AS $procedure$
DECLARE 
  
  V_SQL VARCHAR(4000);
  C_PART RECORD;
 
  BEGIN
         
  FOR C_PART IN select 'CREATE TABLE public.part_' || A.PDATE || ' PARTITION OF public.tb_auto_partion_test FOR VALUES FROM ('''|| A.PDATE ||''') TO (''' || TO_CHAR(TO_DATE(A.PDATE ,'YYYYMMDD') + 1,'YYYYMMDD') || ''')' AS SCRIPT
	     from 
	     (
	      SELECT  to_char(a.date + b.idx -1,'YYYYMMDD') as PDATE 
			FROM ( 
			        SELECT CURRENT_DATE AS date
			    ) a 
			CROSS JOIN ( 
			    SELECT generate_series(1, 7) as idx /* 1번에서 7번까지 순번이 부여되면서 7개의 로우가 생성된다.
			) b
			EXCEPT  /* 오라클에서 minus와 같다 */
			SELECT REPLACE(RELNAME,'part_','') as PDATE 
			  FROM pg_class 
			 WHERE relname LIKE 'part_%' 
			   AND RELHASINDEX = TRUE
			ORDER BY 1
	     ) A
   LOOP		
       V_SQL := C_PART.SCRIPT;
      
       EXECUTE V_SQL;

            
   END LOOP;
       
   EXCEPTION
    WHEN OTHERS THEN
    OUT_RESULT_CD := -1;
    OUT_SQLERR := sqlstate || '(' || SQLCODE || ')';
      
       
  END;
$procedure$
728x90
반응형

댓글



"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

loading