[openGauss]创建存储过程与触发器使用

「这是我参与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();
复制代码

image.png
测试使用触发器:

插入一条id=6的学生数据:

INSERT INTO Student(id, name, sex, grade, major, class, room)
VALUES ('6','cj6','M','21','BD',2, '33#112');
复制代码

查询student_course表,发现自动插入了一条成绩信息:

image.png