在pgsql库用触发器自动触发PostgreSQL的存储过程,实现插入。
需求:在对表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');
注:触发器 中具体语法 可参考菜鸟教程: