mysql存储过程

参考链接

https://www.runoob.com/w3cnote/mysql-stored-procedure.html

  • 存储过程是一组为了完成特定功能的 SQL 语句集合。使用存储过程的目的是将常用或复杂的工作预先用SQL语句写好并用一个指定名称存储起来,这个过程经变和优化后存储在数据库服务器中,因此成为存储过程。当以后需要数据库提供与已定义好的存储过程的功能相同的服务时,只需调用“CALL存储过程名字”即可自动完成。

存储过程通常有如下优点

  1. 封装性 存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句,并且数据库专业人员可以随时对存储过程进行修改,而不会影响到调用它的应用程序源代码。
  2. 可增强SQL语句的功能和灵活性 存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
  3. 可减少网络流量 由于存储过程是在服务器端运行的,且执行速度快,因此当客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而可降低网络负载。
  4. 高性能 存储过程执行一次后,产生的二进制代码就驻留在缓冲区,在以后的调用中,只需要从缓冲区中执行二进制代码即可,从而提高了系统的效率和性能。
  5. 提高数据库的安全性和数据的完整性 使用存储过程可以完成所有数据库操作,并且可以通过编程的方式控制数据库信息访问的权限。

将结束命令修改为其他字符

语法

delimiter $$

创建表

drop database if EXISTS `bankdb`;
create database `bankdb`;
use `bankdb`;

drop table IF EXISTS `bank`;
create table `bank`(
	`cusName` VARCHAR(20),
  `cusMoney` DECIMAL(10,2)
)charset = 'utf8mb4';
insert into bank
VALUES('张三',1000),('李四',1);

创建存储过程

delimiter $$
create PROCEDURE test_bank()
BEGIN
select * from bank;
END $$

调用存储过程

delimiter ;
call test_bank();

创建带参数的存储过程

delimiter $$
create PROCEDURE show_customer
(in name VARCHAR(20))
BEGIN
select * from bank where cusName=name;
END $$

调用带参数的存储过程

先将表格中的内容改为英文

delimiter ;
call show_customer('zhangsan');

mysql存储过程支持三种类型的参数

IN输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)

OUT输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)

INOUT输入/输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

存储过程的参数(in参数)

delimiter $$
create PROCEDURE test(in p_in int)
BEGIN
	SELECT p_in;
  set p_in = 2;
	select p_in;
END $$

delimiter ;
set @p_in=1;
call test(@p_in);

删除存储过程

drop PROCEDURE test;
delimiter $$
drop PROCEDURE test;
create PROCEDURE test(in p_in int)
BEGIN
	SELECT p_in;
  set p_in = 2;
	select p_in;
END $$

delimiter ;
set @num=1;
call test(@num);

out参数

delimiter $$
drop PROCEDURE IF EXISTS test_out;
create PROCEDURE test_out(out p_out int)
BEGIN
	SELECT p_out;
  set p_out = 2;
	select p_out;
END $$
delimiter ;
set @p_out=5;
call test_out(@p_out);

inout参数

delimiter $$
drop PROCEDURE IF EXISTS test_in_out;
create PROCEDURE test_in_out(inout p_in_out int)
BEGIN
	SELECT p_in_out;
  set p_in_out = 2;
	select p_in_out;
END $$

delimiter ;
set @p_in_out=5;
call test_in_out(@p_in_out);

mysql触发器

mysql数据库中触发器是一个特殊的存储过程,不同的是执行存储过程要使用CALL语句来调用,而触发器执行不需要CALL语句来调用,也不需要手工启动,只要一个预定义的时间发生就会被mysql自动调用

引发触发器执行的事件一般如下

  • 增加一条学生记录时,会自动检查年龄是否符合范围要求。
  • 每当删除一条学生信息时,自动删除其成绩表上的对应记录。
  • 每当删除一条数据时,在数据库存档表中保留一个备份副本。

触发程序的优点如下

  • 触发程序的执行是自动的,当对触发程序相关表的数据做出相应的修改后立即执行。
  • 触发程序可以通过数据库中相关的表层叠修改另外的表。
  • 触发程序可以实施比FOREIGN KEY约束、CHECK约束更为复杂的检查和操作。

触发器与表关系密切,主要用于保护表的数据。特别是当有多个表具有一定的相互联系的时候,触发器能够让不同的表保持数据的一致性。

创建表

create table tb_emp8(
	id int(11) not null PRIMARY KEY auto_increment,
	name VARCHAR(22) UNIQUE,
	deptID int(11) not null,
	salary FLOAT DEFAULT 0
)charset = 'utf8mb4';

创建触发器

create TRIGGER SumOfSalary
before insert on tb_emp8
for each ROW
set @sum=@sum+NEW.salary;

插入数据,会自动调用触发器

SET @sum=0;
insert into tb_emp8 
values(3,'C',1,1000),(4,'D',1,500);

select @sum;
select * from tb_emp8;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值