PostgreSQL函数:查询包含时间分区字段的表,并更新dt分区为最新分区

该博客介绍了如何设计并实现一个PL/pgSQL函数,用于在无法连接客户库时,自动更新ods环境中包含dt字段的表的dt值为当前日期。通过查询数据库元数据获取ods层包含dt字段的表名,然后遍历更新每个表,确保即使在特定条件下,数据处理脚本也能正常运行并获取最新数据。
摘要由CSDN通过智能技术生成

一、需求

1、背景

提出新需求后,需要在www环境下进行验收。故需要将www环境脚本每天正常调度

但由于客户库无法连接,ods数据无法每日取,且连不上客户库任务直接报错,不会跑ods之后的任务

故需要让调度正常运行,且能在事实表中看到最新的分区,有的脚本从ods中取数据时取的是where dt=(select max(dt) from ods.xxx)

但有的脚本取的是where dt = to_char(now(),'yyyymmdd'),故运行时,事实表获取不到当日数据

故需要本函数用于更新dt字段

2、需求

找包含dt字段的表,并将这些表的dt值更新为最近的dt

二、函数内容

1、函数内容

CREATE OR REPLACE FUNCTION "ods"."upd_dt_newly_to_now"()
  RETURNS "pg_catalog"."void" AS $BODY$
  DECLARE arrat_t varchar[];
	DECLARE tb_each VARCHAR;
  BEGIN
        select array(SELECT DISTINCT
        C.relname
        FROM
        pg_class AS C,
        pg_attribute AS A,
        pg_tables AS B
        WHERE A.attrelid = C.oid
        and C.relname = B.tablename
        AND A.attnum > 0
        AND B.schemaname = 'ods'
        AND B.tablename NOT SIMILAR TO '[a-z,_]+_2022[0-9]+'
        AND A.attname = 'dt') into arrat_t;
		foreach tb_each in array arrat_t
        loop
            -- 删除表
            raise  notice '更新表 %',tb_each;
            EXECUTE format('update ods.%s set dt=to_char(now(),''yyyymmdd'') where dt = (select max(dt) from ods.%s)', tb_each,tb_each);
        end loop;
  END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

2、调用方式

select "ods"."upd_dt_newly_to_now"();

3、任务编排

连不上客户库时执行,实现同一个脚本可以同时在公司环境和线上同时执行

三、实现过程

-- 一、需求
-- 找到ods层包含dt字段的表
-- 找dt字段,更新dt为今天
-- 二、查询表名
-- 1、查询ods的所有表
select tablename,*
from pg_tables
where schemaname = 'ods';

-- 2、查询ods下包含dt的表名
SELECT DISTINCT
	C.relname
FROM
	pg_class AS C,
	pg_attribute AS A,
	pg_tables AS B
WHERE A.attrelid = C.oid
  and C.relname = B.tablename
  AND A.attnum > 0
  AND B.schemaname = 'ods'
  AND B.tablename NOT SIMILAR TO '[a-z,_]+_2022[0-9]+'
  AND A.attname = 'dt';

-- 二、更新日期
-- 1、更新语句
update ods.icsaleentry set dt=to_char(now(),'yyyymmdd') where dt = (select max(dt) from ods.icsaleentry);

-- 三、思路
-- 1、查询所有表名到数组

-- 2、更新表的日期

-- 四、函数编写
CREATE OR REPLACE FUNCTION "ods"."upd_dt_newly_to_now"()
  RETURNS "pg_catalog"."void" AS $BODY$
  DECLARE arrat_t varchar[];
	DECLARE tb_each VARCHAR;
  BEGIN
        select array(SELECT DISTINCT
        C.relname
        FROM
        pg_class AS C,
        pg_attribute AS A,
        pg_tables AS B
        WHERE A.attrelid = C.oid
        and C.relname = B.tablename
        AND A.attnum > 0
        AND B.schemaname = 'ods'
        AND B.tablename NOT SIMILAR TO '[a-z,_]+_2022[0-9]+'
        AND A.attname = 'dt') into arrat_t;
		foreach tb_each in array arrat_t
        loop
            -- 删除表
            raise  notice '更新表 %',tb_each;
            EXECUTE format('update ods.%s set dt=to_char(now(),''yyyymmdd'') where dt = (select max(dt) from ods.%s)', tb_each,tb_each);
        end loop;
  END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

-- 五、调用
select ods.upd_dt_newly_to_now();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值