Mysql:存储过程、存储函数、触发器

发布于 2021-08-15  1053 次阅读


大二学数据库原理的时候学过,不过有些忘记了,整理一下。

存储过程:存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升

菜鸟教程写的很详细:https://www.runoob.com/w3cnote/mysql-stored-procedure.html

存储过程参数有三个参数:IN OUT INOUT(使用方法:https://www.yiibai.com/mysql/stored-procedures-parameters.html

IN OUT示例:

USE `yiibaidb`;
DROP procedure IF EXISTS `CountOrderByStatus`;

DELIMITER $$
CREATE PROCEDURE CountOrderByStatus(
 IN orderStatus VARCHAR(25),
 OUT total INT)
BEGIN
 SELECT count(orderNumber)
 INTO total
 FROM orders
 WHERE status = orderStatus;
END$$
DELIMITER ;

要获取发货订单的数量,我们调用CountOrderByStatus存储过程,并将订单状态传递为已发货,并传递参数(@total)以获取返回值。

CALL CountOrderByStatus('Shipped',@total);
SELECT @total;

存储函数:存储函数和存储过程很相像,但是它的执行结果会返回一个值。最重要的是存储函数可以被用来充当标准的 SQL 语句,允许程序员有效的扩展 SQL 语言的能力。

delimiter //
create function fun1(id int) returns int
         begin
                   return (select sal from emp where empno=id);
         end //
delimiter ;
select fun1(7698)

触发器: 触发器是用来响应激活或者触发数据库行为事件的存储程序。通常,触发器用来作为数据库操作语言的响应而被调用,触发器可以被用来作为数据校验和自动反向格式化。

提示:delimiter //               --将结束符指定为“//”

示例:创建了一个含有update操作的存储过程

delimiter //
create procedure update_emp(in i int, in p int)
begin
    update employee set phone = p where id = i;
end //

创建一个触发器

delimiter //
# 创建触发器,触发器名称为t1
create trigger t1
    # 触发器执行在update操作之后
    after update
    # 监视employee表
    on employee
    for each row
begin
    # 触发执行的SQL语句
    update tb_class set num = num + 1 where id = 1;
end //

执行存储过程,触发触发器

call update_emp(2, 110);

查看已有触发器: show triggers
删除已有触发器: drop trigger 触发器名称


欢迎欢迎~热烈欢迎~