PostgresSQL存储过程和触发器

news2024/11/15 9:00:31

在次之前首先要搞清楚一个概念

存储过程和触发器,是在基础sql语句之后的另一门语言,类似小学的加减乘除和奥数的关系,他们虽然都是数学,但是运算复杂度和定向思维都有了很大程度的不同

这篇文章不打算把存储过程和触发器事无巨细的讲明白,只能用简单的解释来让大家了解一个大概

他多了if、for、case、when、loop、while 等语法,在普通的sql查询里面是用不了的

%在字符串里表示后面跟上的值
比如raise notice "num为:%",num
  • if
    begin
        if 2 > 3 then
           raise notice  '2大于3';
        else
           if 2 = 3 then
	raise notice '2等于3';
           else
	raise notice '2小于3';
           end if;
        end if;
    end;
  • case
 i int := 100;
    begin
        case
            when i between 1 and 10 then
                 raise notice '[1-10]';
            when i between 11 and 20 then
	raise notice '[11=20]';
            else
	raise notice '其他值';
         end case;
    end;
  • loop
 i int := 1;
   begin
        loop
	exit  when i = 5;	---当i为5的时候退出循环
	i :=i+1;
	continue when mod(i,2)=0;	---continue作用,为偶数时不往下执行
	raise notice '第%次执行',i;
         end loop;
     end;
  • for
    for i in 1..10 loop
    // for i in reverse 10..1	---倒序
        raise notice '第%次循环!',i;
     end loop;
  • 游标,作用与储存,指向这个数据,然后当做一个对象来用

游标的大致用法:

declare
    emp record;	---record PLsql里的类型,要储存查询出来的数据可以用它
    emp_cur  cursor for select * from table limit 10;	---查询前十条数据,游标指向这十条数据
engin
    open emp_cur;	---打开游标
    loop 
      fetch emp_cur into emp;	----fetch获取游标,把数据放到emp
      exit  when not found;	----找不到数据之后退出
      raise notice '姓名:%,性别:%',emp.name,emp.sex;
    end loop;
    close emp_cur;	---释放游标
end;

存储过程

这个不是一个思维,而是一个行动监听
比如我写了一个存储过程,里面的有一个条件是,表格内有什么存储改动,我就做什么行动,不懂没关系,下面有例子

这是我们要用到的表
在这里插入图片描述
基本的表格创建,已经有sql基础的不难看懂,就不啰嗦了

首先是存储过程的语法

create or replace procedure track_change()
AS $$
declare 
//这里用来声明下面会用到的变量
begin
//这里写内容
END
$$ LANGUAGE plpgsql;
//运行该存储过程
call track_change();
  • 直接举栗子

查出mescsnused表里createdate在1小时之内的数据,对每一条数据by csn,usn判断在sfccsnused是否存在,不存在则输出信息:csn:xxx usn:xxx不存在,存在则检查两个表里的reusedable栏位的值是否一致,一致则输出信息:ok,否则输出:csn:xxx usn:xxx reusedable不一致。

create or replace procedure track_change1()
AS $$
declare 
	emp record;
	emp_cur cursor for select * from mescsnused where createdate>now()-interval '1' hour;

	with_count integer;
	with_count1 integer;

	functionname text;
	errormessage text;
begin
	open emp_cur;
	loop
		fetch emp_cur into emp;
		exit  when not found;
			select count(*) into with_count from sfccsnused where csn=emp.csn and usn=emp.usn;
			select count(*) into with_count1 from sfccsnused 
							where csn=emp.csn and usn=emp.usn and reusedable=emp.reusedable;
			if with_count1 = 1 then
				raise notice 'csn:%,usn:%,ok',emp.csn,emp.usn;
			else
				if with_count = 1 then 
				functionname := 'track_change1';
				errormessage := 'csn:%,usn:%:reusedable不一致',emp.csn,emp.usn;
				raise notice 'csn:%,usn:%:reusedable不一致',emp.csn,emp.usn;
			 else
			 	functionname := 'track_change1';
				errormessage := 'csn:%,usn:%不存在',emp.csn,emp.usn;
				raise notice 'csn:%,usn:%不存在',emp.csn,emp.usn;	
			end if;
		end if;
	end loop;
	close emp_cur;
END
$$ LANGUAGE plpgsql;

触发器

顾名思义,就是在你做出某一步操作时,触发这串代码,比如用来捕获异常报错等,创建一个error_log表格专门用来存放被触发后的信息,或者创建其他表格来存放旧的记录

  • 触发器例子:

对mescsnused表建触发器,增删改操时触发,将异动同步到sfcscsnused,同时将csn,usn记录到datalog表,optype根据操作确定,增加:N,修改:U,删除:D,trndate用当前时间

create or replace function trg_mesc()
returns  trigger 
AS $$
begin 
	
	if TG_OP = 'INSERT' then 
		insert into public.sfccsnused(csn,usn,reusedable,createdate)
		values (new.csn,new.usn,new.reusedable,CURRENT_TIMESTAMP);
		insert into public.datalog (csn,usn,optype,createdate)
		values (new.csn,new.usn,'N',CURRENT_TIMESTAMP);
	elseif TG_OP = 'UPDATE' then
		insert into public.sfccsnused(csn,usn,reusedable,createdate)
		values (new.csn,new.usn,new.reusedable,CURRENT_TIMESTAMP);
		insert into public.datalog (csn,usn,optype,createdate)
		values (new.csn,new.usn,'U',CURRENT_TIMESTAMP);
	ELSE
		delete from public.sfccsnused where csn = old.csn;
		insert into public.datalog (csn,usn,optype,createdate)
		values (old.csn,old.usn,'D',CURRENT_TIMESTAMP);
	end if;
return new;
end $$
language plpgsql;

与存储过程不同的是,写完触发器之后需要绑定表明

//trg_mesc_change 为触发器的关键字,任意取名,有意义即可	
create trigger trg_mesc_change after  ---before之前   after之后
insert or update or delete 	--在这三种操作之前记录
on mescsnused for each row 	--mescsnused是表名
execute function trg_mesc();	--然后执行

删除触发器绑定

DROP TRIGGER trg_mesc_change	----trg_mesc_change是触发器名
ON mescsnused;		----mescsnused是表名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP 详细解析SCC4

事务代码:SCC4,选择一个客户端,点击进入,如图: 一、客户端角色 客户控制:客户的角色(生产性,测试,...) 此属性表示 R/3 系统中的客户端角色。其中可能包括…

简单分析Linux虚拟化KVM-Qemu之vhost-net

说明: KVM版本:5.9.1 QEMU版本:5.0.0 工具:Source Insight 3.5, Visio 1. 概述 让我们先来看看问题的引入,在之前的virtio系列文章中,网络虚拟化的框架如下图所示: ​ ​ Qemu中的…

WebRTC-NACK、Pacer和拥塞控制和FEC

NACK机制发送端实现NACK的三个重点流程:发送RTP报文,实时存储报文到packet_history_队列处理接收到的RTCP NACK报文把nack包里的序号放到nack_sequence_numbers丢包队列重发NACK反馈的RTP报文重发报文这里有三点需要注意:1)会判断…

Allegro如何查看PCB上器件的库路径操作指导

Allegro如何查看PCB上器件的库路径操作指导 在做PCB设计的时候,有时需要检查PCB上器件使用的库的路径是否正确,Allegro支持快速将PCB上所有器件的库路径都列出来 如下图 如何显示这个报表,具体操作如下 点击Tools点击Report

蓝桥杯-求和问题

蓝桥杯-求和问题1、问题描述2、解法一:暴力解法(两层循环)3、解法二:结合律(一层循环解决)1、问题描述 给定 n 个整数 a1,a2,...,ana_1,a_2,...,a_na1​,a2​,...,an​,求它们两两相乘再相加的和,即: Sa1.a2a1.a3...a…

Presto 在美图的实践

导读:本文的主题是Presto高性能引擎在美图的实践,首先将介绍美图在处理ad-hoc场景下为何选择Presto,其次我们如何通过外部组件对Presto高可用与稳定性的增强。然后介绍在美图业务中如何做到合理与高效的利用集群资源,最后如何利用…

项目管理的主要内容包括哪些?盘点好用的项目管理系统软件

阅读本文您将了解:1、项目管理的主要内容包括哪些2、好用的项目管理软件 项目管理是为了实施一个特定目标,所实施的一系列针对项目要素的管理过程,包括过程、手段以及技术等。 通过项目管理,我们能够提前安排和控制项目的时间、…

深度解析:我如何用300并发把数据库压挂了

问:为什么300的并发能把支持最大连接数4000数据库压死? 买了一台数据库,最大连接数的参数是 4000,看起来很棒!但是 cpu 和内存并不咋好!是 2c4g的超低配制。但是想着反正业务量也不大,不如先扛…

【vulhub漏洞复现】CVE-2018-2894 Weblogic任意文件上传漏洞

一、漏洞详情影响版本weblogic 10.3.6.0、weblogic 12.1.3.0、weblogic 12.2.1.2、weblogic 12.2.1.3WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应…

Oracle Primavera P6 登录提示错误“该用户已经登录“(SQLite)

目录 引言 解决思路 使用工具 处理办法 引言 在使用Oracle Primavera P6 非正常退出后,Professional再次登录或出现异常,体现为“该用户已经登录。请使用另一个用户名” 以上为近期一个朋友请教的问题,为了给后续出现同样问题朋友给予解…

有限元中四面体的一些积分公式

文章目录有限元中四面体的相关积分公式有限元中四面体的相关积分公式 在 xyzxyzxyz 坐标系中通过四个点 (xi,yi,zi),(xj,yj,zj),(xm,ym,zm),(xp,yp,zp)(x_i, y_i, z_i), (x_j, y_j, z_j), (x_m, y_m, z_m), (x_p, y_p, z_p)(xi​,yi​,zi​),(xj​,yj​,zj​),(xm​,ym​,zm​…

解决PyCharm下OpenCV没有自动补全、函数提示的问题!

Content找到Python环境下的OpenCV安装目录中的“cv2.pyd”文件复制cv2.pyd文件到site-packages文件夹中重启PyCharm,cv2就可以正常使用了最近使用PyCharm编写一段需要使用Opencv库的代码,却发现cv2没有自动补全和函数提示了。博主自己找到以下解决办法&a…

ThreadLocal使用

1、简介ThreadLocal类用来提供线程内部的局部变量,不同的线程之间不会相互干扰这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量在线程的生命周期内起作用,可以减少同一个线程…

CentOS系统编译安装PHP-5.6.27版本

一、手动安装编译工具: yum install -y gcc gcc-c 二、添加用户和用户组: groupadd web useradd -M -s /sbin/nologin -g web php 三、yum安装依赖: yum -y install libmcrypt libmcrypt-devel mcrypt mhash libxml2-devel libpng-devel l…

适应多场景的云桌面metaScreenshare1.0 sdk

概述 metaRTC新推出云桌面metaScreenshare1.0 sdk版本,基于metaIPC1.0搭建,基于mqtt通信,同时支持windows/linux/android操作系统远程桌面控制,支持Nvidia和Intel的GPU编码,适应多种业务场景,可方便集成到…

ElasticSearch 学习笔记总结(四)

文章目录一、ES继承 Spring Data 框架二、SpringData 功能集成三、ES SpringData 文档搜索四、ES 优化 硬件选择五、ES 优化 分片策略六、ES 优化 路由选择七、ES 优化 写入速度优化七、ES 优化 内存设置八、ES 优化 重要配置一、ES继承 Spring Data 框架 Spring Data 是一个用…

【案例教程】拉格朗日粒子扩散模式FLEXPART

拉格朗日粒子扩散模式FLEXPART通过计算点、线、面或体积源释放的大量粒子的轨迹,来描述示踪物在大气中长距离、中尺度的传输、扩散、干湿沉降和辐射衰减等过程。该模式既可以通过时间的前向运算来模拟示踪物由源区向周围的扩散,也可以通过后向运算来确定…

CKKS自举笔记(CKKS Bootstrapping)

文章目录CKKS Bootstrapping流程流程的框架如何做同态取模操作直接泰勒展开(naive idea)采用二倍角公式来拟合(欧密2018)如何做同态编码或解码CKKS的编码和解码基础知识(明文下面怎么做)同态的旋转、共轭&a…

Linux 进程:进程控制

目录一、进程创建1.fork2.vfork二、进程终止三、进程等待四、进程替换1.理解程序替换2.子进程在程序替换中的作用Linux的进程控制分为四部分: 进程创建进程终止进程等待进程替换 一、进程创建 常见的创建进程的函数有两个: pid_t fork(void)pid_t vf…

一篇文章帮助你初步了解CDN内容分发网络

文章目录CDN内容分发网络CDN内容分发网络的工作原理CDN的作用CDN如何实现内容的加速CDN内容分发网络 CDN(Content Delivery Network)内容分发网络。CDN 是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过…