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 ...
随机推荐
- 02 uniapp/微信小程序 项目day02
一.分类 1.1 页面布局 首先创建cate的分支 定义基本结构,因为是两个需要滚动的区域,所以这里要用到组件 scroll 这个组件如果是y scroll那就要固定高度,x scroll那就要固定宽 ...
- kubectl插件管理工具krew
文章转载自:https://blog.51cto.com/loong576/2452592 一.k8s核心组件 Kubernetes 主要由以下几个核心组件组成: etcd 保存了整个集群的状态: a ...
- Elasticsearch:Dynamic mapping
Elasticsearch最重要的功能之一是它试图摆脱你的方式,让你尽快开始探索你的数据. 要索引文档,您不必首先创建索引,定义映射类型和定义字段 - 您只需索引文档,那么index,type和fie ...
- nexus清理释放磁盘空间
应用背景 自建的maven私服(或者叫私仓)nexus在使用过程中,因很多服务不断迭代更新上传jar包至nexus中,底层存放在一个叫Blob Stores的存储中,最近发现该存储已增大至好几百G,有 ...
- vue-router query和params 传参和接收参数
1.params 方式传递和接收参数 //传参 this.$router.push({ name: 'checkDetailInfo', params:{ fkdNum:fkdNum, jyayStr ...
- 研发效能之技术治理&技术治理架构师
最近很多公司专门设置了一个职位叫「技术治理架构师」,主要负责公司技术治理相关事宜.这是个非常有意思的职位.技术治理的活,之前我们也是做的,只是没有提的这么明确,一般都是研发效能团队.PMO.架构团队. ...
- nsis离开自定义页面保存设置
这是群里一位朋友问他的自定义页面设置完成后返回上一步无法保存怎么办写的一个小例子,拓展了下,只要不关闭,不管上一步还是进入下一步返回都可以保留原页面设置. !include LogicLib.nsh ...
- 驱动开发:通过Async反向与内核通信
在前几篇文章中给大家具体解释了驱动与应用层之间正向通信的一些经典案例,本章将继续学习驱动通信,不过这次我们学习的是通过运用Async异步模式实现的反向通信,反向通信机制在开发中时常被用到,例如一个杀毒 ...
- Maximum Entropy Population-Based Training for Zero-Shot Human-AI Coordination
原文:https://www.cnblogs.com/Twobox/p/16791412.html 熵 熵:表述一个概率分布的不确定性.例如一个不倒翁和一个魔方抛到地上,看他们平稳后状态.很明显,魔方 ...
- 使用python制作动图
利用python制作gif图 引言 当写文章时候,多张图片会影响排版,可以考虑制作gif图 准备 pip install imageio 代码 # This is a sample Python sc ...