一、现有函数
— 1、现有函数调用
select ods.deletePartitionIfExists(‘fact_ship’ || ‘_’ || to_char(CURRENT_DATE – INTERVAL’2 month’,’yyyymmdd’));
— 2、函数内容
CREATE OR REPLACE FUNCTION “ods”.”deletepartitionifexists”(“tb_name_partiton_val” varchar)
  RETURNS “pg_catalog”.”void” AS $BODY$
  DECLARE master_name TEXT := tb_name_partiton_val; — 删除分区表 表名

  BEGIN
    — 判断分区名称是否存在,不存在时才需要创建
    IF to_regclass (tb_name_partiton_val) is not null THEN
      — 执行创建分区
      EXECUTE format (‘drop table %s ‘,tb_name_partiton_val);
    END IF;
  END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

— 二、依赖项
— 要求:保留近一个月、两个月、一星期的分区,之前的都删除
— 函数体:del_schema_period(schema_name,table_name,period_saved)
— 1、现有函数逻辑
— 判断存在表的话(to_regclass (tb_name_partiton_val)),删除两月前的当日分区
drop table if exists ap.fact_ship_20220910;
select to_regclass(‘fact_ship’) ; –是否存在此表,不存在返回null,存在返回表名
— 2、日期
select to_char(date_trunc(‘day’,now())+’-1 day’,’yyyymmdd’);
— 3、查询模式下的表
select tablename
from pg_tables
where schemaname = ‘ods’
and tablename like ‘ods_icsale_%’;
— and position (‘_2’ in tablename) = 0;

— 三、过程
— 要求:保留近一个月、两个月、一星期的分区,之前的都删除【先删除数据,再判断是否存在表,删除结构】
— 函数体:del_schema_period(schema_name,table_name,period_saved)
— 调用:select ods.del_schema_period(‘ap’,’fact_ship’,’4 days’)
select ods.del_schema_period(‘ap’,’fact_ship’,’4 days’)
— 1、删除指定日期的数据
CREATE OR REPLACE FUNCTION “ods”.”del_schema_period”(schema_name varchar,table_name varchar,period_saved varchar)
  RETURNS “pg_catalog”.void AS $BODY$
  BEGIN
      EXECUTE format(‘delete from %s.%s where dt < to_char(date_trunc(”day”,now())+”- %s”,”yyyymmdd”)’,schema_name,table_name,period_saved);
  END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

— 2、如果是分区表,删除表结构
CREATE OR REPLACE FUNCTION “ods”.”del_schema_period”(schema_name varchar,table_name varchar,period_saved varchar)
  RETURNS “pg_catalog”.void AS $BODY$
  DECLARE arrat_t varchar[];
    DECLARE dt_split INTERVAL=’-‘ ||period_saved;
    DECLARE tb_each VARCHAR;
  BEGIN
        — 删除指定日期的数据
        EXECUTE format(‘delete from %s.%s where dt < to_char(date_trunc(”day”,now())+”- %s”,”yyyymmdd”)’,schema_name,table_name,period_saved);
        — 如果存在分区表,则删除对应的物理表
        select array(select tablename
        from (
            select tablename,concat(’20’,split_part(tablename,’_20′,2)) as mon_day
            from pg_tables
            where schemaname = schema_name
            and tablename like concat(table_name,’_%’)
        ) a
        where mon_day < to_char(date_trunc(‘day’,now()) + dt_split,’yyyymmdd’)) into arrat_t;
        raise notice ‘helloworld %’,arrat_t;
        — 遍历数组的每个值,删除对应的表结构
                foreach tb_each in array arrat_t
        loop
            — 删除表
                        raise notice ‘helloworld %’,tb_each;
                        EXECUTE format(‘DROP TABLE IF EXISTS %s.%s’, schema_name,tb_each);
        end loop;
  END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
— 使用:
select ods.del_schema_period(‘ap’,’fact_ship’,’70 days’)

原文地址:http://www.cnblogs.com/liujinhui/p/16852389.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性