当前位置: 首页 > news >正文

postgresql 实现变量替换框架

替代变量

  • psql自带的替代变量通过 \set 定义,通过 : 调用
  • 匿名程序块和程序中不能识别替代变量

vardef表

字段名字段类型是否主键默认值说明
varnamevarchar(63)变量名
varvaluevarchar(63)变量值
vardesctext变量说明
createtimetimestampcurrent_timestamp变量创建时间
drop table if exists vardef cascade;
create table vardef (
     varname varchar(63)  --变量名
    ,varvalue varchar(2000)  --变量值
    ,vardesc text  --变量说明
    ,createtime timestamp default current_timestamp  --变量创建时间
);
comment on table vardef is '变量定义表';
comment on column vardef.varname is '变量名';
comment on column vardef.varvalue is '变量值得定义';
comment on column vardef.vardesc is '变量描述';
comment on column vardef.createtime is '变量创建时间';

get_vardef 函数

create or replace function get_vardef(vardef_sql varchar) 
 returns varchar
 language plpgsql
as $function$ 
/*
 * 作者:v-yuzhenc
 * 功能:返回指定变量定义具体实时的值
 * vardef_sql:变量定义
 * */
declare 
    p_result varchar;
    p_vardef_sql varchar;
begin
    execute 'select '||vardef_sql into p_result;
       return p_result;
    exception when others then 
        return p_result;
end;
$function$
;

v_vardef视图

字段名字段类型说明
currenttimetimestamp当前时间
varnamevarchar(63)变量名
varvaluevarchar(63)当前时间变量的值
vardesctext变量描述
create or replace view v_vardef as
select 
     current_timestamp as currenttime
    ,varname
    ,get_vardef(varvalue) as varvalue
    ,vardesc
from vardef
;

comment on view v_vardef is '实时变量表';
comment on column v_vardef.currenttime is '当前时间';
comment on column v_vardef.varname is '变量名';
comment on column v_vardef.varvalue is '当前时间变量的值';
comment on column v_vardef.vardesc is '变量描述';

变量定义

变量名变量定义变量说明
todayto_char(current_date,‘yyyymmdd’)今天
tomorrowto_char(current_date+1,‘yyyymmdd’)明天
thismonthto_char(current_date,‘yyyymm’)本月
lastmonthto_char(to_date(to_char(current_date,‘yyyymm’)||‘01’,‘yyyymmdd’)-1,‘yyyymm’)上月
nextmonth(to_char(current_date,‘yyyymm’)::numeric+1)::varchar下个月
insert into vardef (
     varname  --变量名
    ,varvalue  --变量值
    ,vardesc  --变量说明
) values (
     'today'
    ,$$to_char(current_date,'yyyymmdd')$$
    ,'今天'
);
insert into vardef (
     varname  --变量名
    ,varvalue  --变量值
    ,vardesc  --变量说明
) values (
     'tomorrow'
    ,$$to_char(current_date+1,'yyyymmdd')$$
    ,'明天'
);
insert into vardef (
     varname  --变量名
    ,varvalue  --变量值
    ,vardesc  --变量说明
) values (
     'yesterday'
    ,$$to_char(current_date-1,'yyyymmdd')$$
    ,'昨天'
);
insert into vardef (
     varname  --变量名
    ,varvalue  --变量值
    ,vardesc  --变量说明
) values (
     'thismonth'
    ,$$to_char(current_date,'yyyymm')$$
    ,'本月'
);
insert into vardef (
     varname  --变量名
    ,varvalue  --变量值
    ,vardesc  --变量说明
) values (
     'lastmonth'
    ,$$to_char(to_date(to_char(current_date,'yyyymm')||'01','yyyymmdd')-1,'yyyymm')$$
    ,'上月'
);
insert into vardef (
     varname  --变量名
    ,varvalue  --变量值
    ,vardesc  --变量说明
) values (
     'nextmonth'
    ,$$(to_char(current_date,'yyyymm')::numeric+1)::varchar$$
    ,'下个月'
);

每天生成变量文件

--每天00:05分生成一个变量文件
#! /bin/bash

# /home/postgres/create_dayvar.sh

psql <<EOF
--不显示角标
\pset footer
--不显示标题
\pset t
--输出今天的变量定义
\o ~/var/today.sql
select '\set '||varname||' '||varvalue from v_vardef; --查出的变量定义会存到上面指定的文件中
--备份今天的变量
\! cp ~/var/today.sql ~/var/`date '+%Y%m%d'`.sql
--退出
\q
EOF
chmod +x /home/postgres/create_dayvar.sh
crontab -e
5 0 * * * . /home/postgres/create_dayvar.sh >> /dev/null

测试

/home/postgres/create_dayvar.sh > /dev/null

在这里插入图片描述

psql <<EOF
\i ~/var/20220831.sql
select :today;
select :tomorrow;
select :yesterday;
select :thismonth;
select :lastmonth;
select :nextmonth;
\q
EOF

在这里插入图片描述

相关文章:

  • numpy在数字图像处理中的应用
  • A tour of gRPC:09 - gRPC Interceptor 拦截器
  • 【Docker】——Network
  • Vue3如何实现全屏模式
  • 新型数据中心网络安全体系研究
  • Android获取手机电压,电流,电量,BatteryManager
  • 光纤通信数字孪生系统架构及关键技术研究
  • 数据结构与算法复习:第三十四弹
  • 元宇宙会场APP功能系统软件源码开发
  • 【反诈拒赌 支付在行动】涉赌资金转移典型案例及风险提示
  • 【Python黑科技】把秘密写在照片里(保姆级图文+实现代码)
  • OpenGL ES学习(7)——混合
  • Spoon Kettle 连接之记录集连接详解(Merge join)
  • 光传送网管控融合研究与智能化演进思考
  • 应对三大行业痛点,利尔达用芯打造智能换电系统平台
  • [PHP内核探索]PHP中的哈希表
  • spark本地环境的搭建到运行第一个spark程序
  • spring-boot List转Page
  • SpringBoot几种定时任务的实现方式
  • supervisor 永不挂掉的进程 安装以及使用
  • Xmanager 远程桌面 CentOS 7
  • 包装类对象
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 聊聊redis的数据结构的应用
  • 如何学习JavaEE,项目又该如何做?
  • 设计模式 开闭原则
  • 写给高年级小学生看的《Bash 指南》
  • 正则与JS中的正则
  • 终端用户监控:真实用户监控还是模拟监控?
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​linux启动进程的方式
  • ​TypeScript都不会用,也敢说会前端?
  • # 达梦数据库知识点
  • (c语言)strcpy函数用法
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (力扣)循环队列的实现与详解(C语言)
  • (十六)串口UART
  • (转)一些感悟
  • ***测试-HTTP方法
  • .net Signalr 使用笔记
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .skip() 和 .only() 的使用
  • @ResponseBody
  • @Transactional 详解
  • [ JavaScript ] JSON方法
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [C/C++] C/C++中数字与字符串之间的转换
  • [Go WebSocket] 多房间的聊天室(三)自动清理无人房间
  • [HEOI2013]ALO
  • [JS]JavaScript 注释 输入输出语句
  • [JS真好玩] 掘金创作者必备: 监控每天是谁取关了你?
  • [k8s系列]:kubernetes·概念入门