PostgreSQL函数:查询包含时间分区字段的表,并更新dt分区为最新分区
一、需求
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();
PostgreSQL函数:查询包含时间分区字段的表,并更新dt分区为最新分区的更多相关文章
- Mysql查询用逗号分隔的字段-字符串函数FIND_IN_SET(),以及此函数与in()函数的区别
查询用逗号分隔的字段,可以用字符串函数FIND_IN_SET(): 查询数据库表中某个字段(值分行显示),可以用函数in(). 今天工作中遇到一个问题,就是用FIND_IN_SET()函数解决的. 第 ...
- 函数查询(Function Query)
函数查询 可以利用 numeric字段的值 或者 与字段相关的的某个特定的值的函数,来对文档进行评分. 1. 使用函数查询的方法 这里主要有三种方法可以使用函数查询,这三种s方法都是通过solr ...
- 【LOB】使用USER_LOBS视图获得当前用户包含LOB字段的表
包含LOB类型字段的表往往需要特殊关照,如何快速的获得包含LOB对象的数据库表?使用DBA_LOBS.ALL_LOBS和USER_LOBS视图可以很方便地获得包含BLOB或CLOB字段的表. 简单看一 ...
- MYSQL的分区字段,必须包含在主键字段内
MYSQL的分区字段,必须包含在主键字段内 MYSQL的分区字段,必须包含在主键字段内 在对表进行分区时,如果分区字段没有包含在主键字段内,如表A的主键为ID,分区字段为createtime ,按 ...
- Oracle生成查询包含指定字段名对应的所有数据表记录语句
应用场合:已知字段名字,查询数据库中所有数据表中包含该字段名的所有数据表 操作办法:指定字段名,数据库表用户,执行下面查询语句即可 --Oracle生成查询包含指定字段名对应的所有数据表记录语句 de ...
- MySQL中 如何查询表名中包含某字段的表 ,查询MySql数据库架构信息:数据库,表,表字段
--查询tablename 数据库中 以"_copy" 结尾的表 select table_name from information_schema.tables where ta ...
- 【数据库】MySQL 函数大全包含示例(涵盖了常用如时间、数字、字符串处理、数据流函数的和一些冷门的)
ps:博客园markdown不能自动生成列表,更好的阅读体验可访问我的个人博客http://www.isspark.com/archives/mysqlFunctionDesc 数学函数(Mathem ...
- hive中为分区表增加字段需要注意默认不会修改已有分区的字段,导致查询时新增字段为null
若向hive表添加字段,通常会使用下面这种语句 alter table default.testparquet add columns(c8 string); 但是对于分区表来说, 1. 若新建的分区 ...
- Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件
首先说一下,这里解决的问题应用场景: sparksql处理Hive表数据时,判断加载的是否是分区表,以及分区表的字段有哪些?再进一步限制查询分区表必须指定分区? 这里涉及到两种情况:select SQ ...
- SQLserver查询库中包含某个字段的表
select [name] from [TPMS_PRD].[dbo].sysobjects where id in(select id from [TPMS_PRD].[dbo].syscolumn ...
随机推荐
- flutter系列之:flutter中常用的Stack layout详解
[toc] 简介 对于现代APP的应用来说,为了更加美观,通常会需要用到不同图像的堆叠效果,比如在一个APP用户背景头像上面添加一个按钮,表示可以修改用户信息等. 要实现这样的效果,我们需要在一个Im ...
- C语言[char**]与[malloc]的组合使用
简介 首先!要搞懂char**是什么? 我们知道 char* 是字符指针,是一个地址,指向一个字符串. 那么 char** 就是指向 char* 的指针,也是一个地址,指向指针的指针. 使用char* ...
- Solutions:Elastic SIEM - 适用于家庭和企业的安全防护 ( 五)
- 第六章:Django 综合篇 - 5:自定义django-admin命令
我们可以通过manage.py编写和注册自定义的命令. 自定义的管理命令对于独立脚本非常有用,特别是那些使用Linux的crontab服务,或者Windows的调度任务执行的脚本.比如,你有个需求,需 ...
- linux开机自启服务
前言:最近,有一个项目需要用到开机自动启动机房,所以就研究了一下 1.把node的快捷方式放在放在/usr/bin/(环境变量)下面,所有的命令默认是从这里面进行调用的 ln -s /home/too ...
- sql limit函数
select * from <表名> order by <列名> desc limit <第几位数>; select * from villa_info order ...
- 实时营销引擎在vivo营销自动化中的实践 | 引擎篇04
作者:vivo 互联网服务器团队 本文是<vivo营销自动化技术解密>的第5篇文章,重点分析介绍在营销自动化业务中实时营销场景的背景价值.实时营销引擎架构以及项目开发过程中如何利用动态队列 ...
- 记一次 .NET 某企业OA后端服务 卡死分析
一:背景 1.讲故事 前段时间有位朋友微信找到我,说他生产机器上的 Console 服务看起来像是卡死了,也不生成日志,对方也收不到我的httpclient请求,不知道程序出现什么情况了,特来寻求帮助 ...
- nginx 通过IP访问项目
项目新需求,因为是小范围使用的网站,所以不打算配域名,直接通过IP访问当前项目. 环境: LNMP 一键集成环境 当前IP指向的目录 :/home/wwwroot/default/ 但是我的项目.需要 ...
- golang中的选项模式
索引 https://waterflow.link/articles/1663835071801 当我在使用go-zero时,我看到了好多像下面这样的代码: ... type ( // RunOpti ...