mysql整理10-存储程序(存储过程,存储函数,触发器)

目录

存储程序的优缺点
存储程序的分类
     i.存储过程procedure
          if语法
          循环语法:while 、 loop 、repeat
     ii.存储函数(函数)function
          函数和存储过程区别
     iii.触发器trigger
          触发器注意事项:

存储程序运行于服务器端程序

存储程序的优缺点
优点
i.简化开发
ii.执行效率较高
缺点
i.程序保存在服务器端,占用服务器资源
ii.数据迁移
iii.调试编写程序不方便

存储程序的分类

存储程序分为三类:存储过程,函数和触发器

i.存储过程procedure

因为mysql一遇到分号,它就要自动执行。
这种情况下,就可以使用delimiter,把delimiter后面换成其它符号,如//或$$

#创建

delimiter //;
create procedure sel_emp()
begin
	 select dname,ename from emp,dept where dept.deptno=emp.deptno;
end;

#调用

call sel_emp();

参数的模式:
In:传入模式 默认
Out:传出模式
Inout:传入传出模式

#根据员工姓名查询员工职位

delimiter //;
create procedure findJob(inout name_job varchar(20))
begin
  select job into name_job from emp where ename = name_job;
end;

#设置参数值
set @name_job='smith';
#调用
call findJob(@name_job);

select @name_job;
if语法:
delimiter //;
create procedure score_level(score int)
begin
  #变量声明
  declare v_level varchar(20);
  if score >= 80 then
		#变量赋值
		set v_level='A';
  elseif score>=60 then
	    set v_level='B';
  else
   	set v_level='C';
  end if;	
	select v_level;	
end;
循环(1+2+…+100)

MySQL三种循环 while 、 loop 、repeat

循环方式一:while循环

delimiter //;
create procedure calc()
begin
  declare i int;
  declare sum int;
  set i=1;
  set sum=0;

# while循环	
while i<=100 do
    set sum = sum + i;
	set i = i + 1;
end while;

  select sum;
end;

# 调用
call calc();

循环方式二:loop循环:

delimiter //;
create procedure calc1()
begin
    declare i int;
	declare sum int;
	set i=1;
	set sum=0;
	
	# loop循环
	lip:loop
	  set sum = sum + i;
	  set i = i +1;
	  		# 嵌套if
			if i>100 then
			  leave lip;
			end if;
	end loop;
	
  select sum;
end;

# 调用
call calc1();

循环方式三:repeat循环:

delimiter //;
create procedure calc2()
begin
  declare i int;
	declare sum int;
	set i=1;
	set sum=0;
	
	repeat
	  set sum = sum + i;
		set  i = i + 1;
	  until i > 100
	end repeat;
	
  select sum;
end;

call calc2();
ii.存储函数(函数)function

存储在服务器端,有返回值,函数作为sql一部分使用。

#根据用户编号查询姓名

delimiter //;

create function findNameByNo(eno int) returns varchar(20) 
DETERMINISTIC 
begin
  declare v_name varchar(20);
  select ename into v_name from emp where empno = eno;
  return v_name;
end;

# 调用方式
select findNameByNo(7788);
函数和存储过程区别:
 关键字不同
 存储过程三种参数模式实现数据输入输出;函数有返回值返回数据;
 存储过程可以作为独立个体执行,函数只能作为sql的一部分执行。
iii.触发器trigger

存储程序,存储在服务器端。
由事件(增删改)调用,不能传参。

CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name
    trigger_time trigger_event
    ON tbl_name FOR EACH ROW
    [trigger_order]
    trigger_body
trigger_time: { BEFORE | AFTER }
trigger_event: { INSERT | UPDATE | DELETE }
trigger_order: { FOLLOWS | PRECEDES } other_trigger_name

demo:

delimiter //;
create trigger tri_user
after delete
on userinfo for each row
begin
	# old  new
   insert into user_bak values(old.uid,old.uname,old.password);
end;

触发器注意事项:

	不要添加过多触发器,降低效率
    存储程序中不能使用事务控制。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值