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

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

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

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

sql
닫기
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
반응형


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