「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战」
前言
存储过程类似于数据库中的函数功能,我们可以通过传入参数(或者留空),可以方便我们的数据库使用,与触发器配合,就可以实现许多复杂的自动化操作。
存储进程
这里以统计表数据个数为例:
CREATE OR REPLACE FUNCTION count_(name text)
returns integer as $$
DECLARE
counts integer;
BEGIN
sql := 'SELECT COUNT(*) FROM ' || $1;\
EXECUTE sql INTO counts USING "name";
return counts;
END;
$$ language plpgsql;
复制代码
CREATE OR REPLACE:表示若不存在同名称存储进程,则实现创建,若存在,则覆盖原有存储进程。
returns:定义返回的数据以及其类型,这里仅返回一个整数类型变量。
DECLARE:表示在此存储进程中定义的变量,这里我建立了一个整数类型的counts变量,用于记录表内字段数量。
BEGIN ... END;:该BEGIN和END作为存储进程的主体部分,所有的执行操作都将在此执行实现。
|| $1:通过||可实现sql语句与变量的拼接,变量可使用变量名传递,也可以使用$n的方式实现。
SELECT ... INTO ...:SELECT ... INTO可以实现对变量的赋值操作,这里我们将COUNT(*)得到的字段数量使用INTO赋值给了counts,然后通过return,实现了函数返回。
$$ language plpgsql:与上面的返回值定义配合,可定义语言类型(另外一个是sql),这里就不展开了。
使用CALL count_table('student');即可实现调用存储进程。
触发器
创建一个触发器,实现学生自动选修id=1的课程:
在实现触发器之前,可以先构建一个存储进程,实现student_course表数据插入操作:
-- 创建插入函数
CREATE OR REPLACE FUNCTION insert_course() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO student_course(student_id, course_id) VALUES (NEW.id, '1');
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
复制代码
然后借用上面的存储进程,构建插入触发器:
-- 创建触发器
CREATE TRIGGER abab AFTER INSERT
ON student FOR EACH ROW
EXECUTE PROCEDURE insert_course();
复制代码
测试使用触发器:
插入一条id=6的学生数据:
INSERT INTO Student(id, name, sex, grade, major, class, room)
VALUES ('6','cj6','M','21','BD',2, '33#112');
复制代码
查询student_course表,发现自动插入了一条成绩信息:




近期评论