在pgsql库用触发器自动触发PostgreSQL的存储过程,实现插入。

时间:2024-01-27 17:24:28

需求:在对表A 执行 insert操作时,筛选符合条件的数据 insert到表B中,编写为存储过程(postgreSQL数据库)
 [筛选条件]:
1. dd !="A" 或是 dd为 null;
2. aa 字段第【3】位="5"或="6";
3. 满足条件1不满足2的数据将字段 aa、bb、cc插入表 B;
    满足条件1和2的数据将字段 aa、bb、cc、dd="1"插入表 B。


 1、创建A表:

create table A(
aa VARCHAR(50) NOT NULL,
bb VARCHAR(50) NOT NULL,
cc VARCHAR(3) NOT NULL, 
dd VARCHAR(1)
);

 

2、创建B表:

create table B(
aa VARCHAR(50) NOT NULL,
bb VARCHAR(50) NOT NULL,
cc VARCHAR(3) NOT NULL,
hh VARCHAR(1) DEFAULT '0',
ii VARCHAR(1) DEFAULT '0',
dd VARCHAR(1) DEFAULT '0',
PRIMARY KEY (bb)
); 

 

 3、创建存储过程:

CREATE OR REPLACE FUNCTION insert_table () RETURNS trigger
VOLATILE
AS $pgsql$
declare
value1 varchar(50);
value2 varchar(50);
value3 varchar(3);

BEGIN
if (NEW.dd is null or NEW.dd != 'A') then
value1 := NEW.aa;
value2 := NEW.bb;
value3 := NEW.cc;
if (substring(value1,3,1) = '5' or substring(value1,3,1) = '6') then
insert into B (aa,bb,cc,dd) values(value1,value2,value3,'1');
else
insert into B (aa,bb,cc) values(value1,value2,value3);
end if;
end if;
return new; 
end;
$pgsql$ LANGUAGE plpgsql; 

【注:如果是在 DbVisualizer 工具创建 存储过程,必须 在第一行加上 --/ 和最后一行加上 / ,否则报错!】
【insert 时 NEW 表示新插入的行数据】

 

4、创建触发器:

CREATE TRIGGER "example_trigger"
AFTER INSERT ON A
FOR EACH ROW
EXECUTE PROCEDURE insert_table(); 

【AFTER 关键字决定是在关联行的插入之后执行触发器动作】
【FOR EACH ROW 在一次操作表的语句中,每操作成功一行就会触发一次;不写的 话,表示是表级触发器,则无论操作多少行,都只触发一次】

 

5、插入insert语句测试:

insert into A values('a4567','AWM2020','3',null);
insert into A values('b4797','AWM2021','4',null);
insert into A values('c4567','AWM2022','5','A');
insert into A values('d4797','AWM2023','6','2');

 

 

注:触发器 中具体语法 可参考菜鸟教程:

https://www.runoob.com/postgresql/postgresql-trigger.html