postgresql函数:满足特定格式的表及指定日期前的删除
-- 一、现有函数
-- 1、现有函数调用
select "ap"."delete_analysis_backup"('ap');
-- 2、函数内容
CREATE OR REPLACE FUNCTION "ap"."delete_analysis_backup"("schema_name" varchar)
RETURNS "pg_catalog"."void" AS $BODY$ DECLARE
row_tag VARCHAR ( 200 );
BEGIN-- Created by Liu Jinhui
FOR row_tag IN (
SELECT TABLE_NAME
FROM
(
SELECT
tablename AS TABLE_NAME,
( regexp_match ( tablename, 'analysis_[a-z,_]+_([0-9]{8,8})' ) ) [ 1 ] AS table_backup_time
FROM
pg_tables
WHERE
schemaname = schema_name
AND tablename SIMILAR TO 'analysis_[a-z,_]+_[0-9]{8,12}'
) A
WHERE
DATE_TRUNC( 'day', to_date( A.table_backup_time, 'yyyyMMdd' ) ) < DATE_TRUNC( 'day', now( ) + '-7 day' )
)
LOOP
RAISE notice'表名为:%',
row_tag;
EXECUTE concat ( 'drop table ', SCHEMA_NAME, '.', row_tag );
END LOOP;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
-- 二、依赖项
-- 要求:删除ods包含gyy的表,删除一个月
-- 函数头:del_special_struct(schema_name,period_saved,remark)
-- 调用:
select ods.del_special_struct('ap','1 days','删除以往的分析对象模型')
select ods.del_special_struct('ods','31 days','删除一个月之前的gyy物理备份表')
-- 三、过程
-- 要求:删除ods包含gyy的表,删除一个月
-- 函数头:del_special_struct(schema_name,period_saved,remark)
-- 调用:
select ods.del_special_struct('ap','1 days','删除以往的分析对象模型');
select ods.del_special_struct('ods','31 days','删除一个月之前的gyy物理备份表');
-- 1、ap
CREATE OR REPLACE FUNCTION ods.del_special_struct(schema_name varchar,period_saved varchar,remark varchar)
RETURNS "pg_catalog"."void" AS $BODY$ DECLARE
BEGIN
if schema_name = 'ap' then
EXECUTE select "ap"."delete_analysis_backup"('ap');
else
-- gyy删除一个月前的表
end if;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
-- 2、ods的管易云删除逻辑
-- (1)查询出所有满足条件的表
select tablename,to_char(date(concat('20',split_part(tablename,'_20',2))),'yyyymmdd') as mon_day
from pg_tables
where schemaname = 'ods'
and tablename SIMILAR TO 'ods_trade_[a-z,_]+gyy_[2022][0-9,_]+'
and to_char(date(concat('20',split_part(tablename,'_20',2))),'yyyymmdd') < to_char(date_trunc('day',now())+'-30 days','yyyymmdd')
-- (2)删除表
CREATE OR REPLACE FUNCTION ods.del_special_struct(schema_name varchar,period_saved varchar,remark varchar)
RETURNS "pg_catalog"."void" AS $BODY$ DECLARE
DECLARE arrat_t varchar[];
DECLARE dt_split INTERVAL='-' ||period_saved;
DECLARE tb_each VARCHAR;
DECLARE res VARCHAR;
BEGIN
if schema_name = 'ap' then
select ap.delete_analysis_backup('ap') into res;
else
-- gyy删除一个月前的表
-- 如果存在分区表,则删除对应的物理表
select array(
select tablename from (
select tablename,to_char(date(concat('20',split_part(tablename,'_20',2))),'yyyymmdd') as mon_day
from pg_tables
where schemaname = 'ods'
and tablename SIMILAR TO 'ods_trade_[a-z,_]+gyy_[2022][0-9,_]+'
and to_char(date(concat('202',split_part(tablename,'_202',2))),'yyyymmdd') < to_char(date_trunc('day',now())+dt_split,'yyyymmdd')
) all_table) into arrat_t;
foreach tb_each in array arrat_t
loop
EXECUTE format('DROP TABLE IF EXISTS %s.%s', schema_name,tb_each);
end loop;
end if;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
本文来自博客园,作者:哥们要飞,转载请注明原文链接:https://www.cnblogs.com/liujinhui/p/16852394.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2021-11-02 【每日一题】【比较中右,内部比较中右,注意边界带>=】2021年11月2日-搜索旋转排序数组-211102/220211
2021-11-02 【Hadoop学习】下:MapReduce程序编写、Hadoop序列化、框架原理、Yarn组件、设置队列