一、现有函数
-- 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')

postgresql函数:定期删除模式下指定天数前的表数据及分区物理表的更多相关文章

  1. 删除指定路径下指定天数之前(以文件的创建日期为准)的文件:BAT + REG + Ritchie Lawrence 日期函数

    代码如下: @echo off::演示:删除指定路径下指定天数之前(以文件的创建日期为准)的文件.::如果演示结果无误,把del前面的echo去掉,即可实现真正删除.::本例调用了 Ritchie L ...

  2. Linux下通过脚本自动备份Oracle数据库并删除指定天数前的备份

    说明: Oracle数据库服务器操作系统:CentOSIP:192.168.0.198端口:1521SID:orclOracle数据库版本:Oracle11gR2 具体操作: 1.root用户登录服务 ...

  3. Linux下定时切割Mongodb数据库日志并删除指定天数前的日志记录

    此为在网络上找来的,觉得很好! 实现目的: 对Mongodb数据库日志按天保存,并且只保留最近7天的日志记录. 具体操作: 使用Mongodb数据库自带的命令来切割日志 ps -def | grep ...

  4. Linux下自动备份Oracle数据库并删除指定天数前的备份

    说明: Oracle数据库服务器 操作系统:CentOS IP:192.168.0.198 端口:1521 SID:orcl Oracle数据库版本:Oracle11gR2 具体操作: 1.root用 ...

  5. 删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件:BAT + VBS

    代码如下: @echo off ::演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件. ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除. ::本例调用了临时VBS ...

  6. 删除指定路径下指定天数之前(以文件的修改日期为准)的文件:forfiles

    删除指定路径下指定天数之前(以文件的修改日期为准)的文件:forfiles 代码如下: @echo off ::演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件. ::如果演示结果无 ...

  7. Mongodb自动备份数据库并删除指定天数前的备份

    1.创建Mongodb数据库备份目录 mkdir -p /home/backup/mongod_bak/mongod_bak_now mkdir -p /home/backup/mongod_bak/ ...

  8. 在MVC模式下通过Jqgrid表格操作MongoDB数据

    看到下图,是通过Jqgrid实现表格数据的基本增删查改的操作.表格数据增删改是一般企业应用系统开发的常见功能,不过不同的是这个表格数据来源是非关系型的数据库MongoDB.nosql虽然概念新颖,但是 ...

  9. List遍历删除 或取指定的前N项

    class Program { static void Main(string[] args) { /* * List遍历删除 或取指定的前N项 */ List<PerSon> listP ...

  10. postgresql 不同数据库不同模式下的数据迁移

    编写不容易,转载请注明出处谢谢, 数据迁移 因为之前爬虫的时候,一部分数据并没有上传到服务器,在本地.本来用的就是postgresql,也没用多久,数据迁移的时候,也遇到了很多问题,第一次使pg_du ...

随机推荐

  1. logstash知识点

    Logstash是位于Data和Elasticsearch之间的一个中间件.Logstash是一个功能强大的工具,可与各种部署集成. 它提供了大量插件. 它从数据源实时地把数据进行采集,可帮助您解析, ...

  2. k8s中安装redis6集群

    注意:第二步不用操作了,yaml文件仅供参考 1.创建Namespace kubectl apply -f Namespace.yaml apiVersion: v1 kind: Namespace ...

  3. APICloud可视化编程(二)

    上一期我们为大家讲解低代码在国内市场的当前现状以及APICloud可视化开发工具的组件类型和特点.相信大家对可视化编程有了一个整体的了解,那么今天带大家更进一步的使用组件. 下载开发工具 登录APIC ...

  4. VMware安装Win11+WSA子系统和使用教程

    VMware安装Win11+WSA子系统和使用教程 作者:Sna1lGo 时间:2022/9/29 下载相关文件: Win11镜像:Download Windows 11 (microsoft.com ...

  5. 关于HM NISEDIT在新版系统下编译并运行提示权限不足问题的解决方案

    如果你使用过NSIS为你的项目制作过安装包,那HM nisedit一定是你绕不过去的槛,作为NSIS号称的最佳免费IDE/编辑器,功能齐全,与NSIS配合性能强悍,实至名归.只是开发作者最后版本更新在 ...

  6. css过渡样式

    transition: 2s;//过渡两秒 用法: .div{ transition: 2s; }

  7. CentOS部署MySQL

    Linux上安装MySQL 第一步:确保服务器在最新的状态(可有可无) [root@chenstudy ~]# yum -y update 第二步:检测系统是否自带安装MySQL 我之前安装过MySQ ...

  8. POJ1185 [NOI2001] 炮兵阵地 (状压DP)

    又是一道有合法性检测的状压题. dp[i][j][k]表示第i行状态为j,i-1行状态为k时前i行放置的最大数量. 注意22行统计二进制数中1的个数时的巧妙方法. 1 #include<cstd ...

  9. 【nginx】使用 nginx 时,使用 sub_filter 注入 js 代码,例如 google analysis 等

    目录 1. 创建 GA 1 2. 注入代码2 结果 网站 F12 GA 控制台 Reference 在一项工作中,已经将内网的一个网站通过 二级域名 + nginx + frp 的方式映射到公网.网站 ...

  10. 【JavaScript排序】 sort()方法(解决null、undefined、0之间的排序(混乱)问题)

    JavaScript排序 - sort()方法 --解决null.undefined.0之间的排序(混乱)问题 一.普通的数组排序 ​ JavaScript中用方法sort()为数组排序.sort() ...