MySQL 存储过程

定义:

一组为了完成特定功能的SQL语句集,存储在数据库中经过

第一次编译后再次调用不需要再次编译,用户通过指定存储过程

的名字并给出参数来执行它。

优点:

1、增强SQL语言的功能和灵活

2、标准组件式编程,预编译!

3、较快的执行速度

4、减少网络流量

5、保证数据的安全

缺点:

1、可移植性差

2、统一标准,后期维护大。

一、定义存储过程

语法:

create procedure 过程名(参数1,参数2)
begin
   SQL语句
end
#要先修改mysql结束符号,delimiter  新的符号 可以是%或者//
delimiter //
例子:
delimiter //
create procedure fun()
begin
   select * from mysql.user;
end//
#调用存储过程
语法:
call 过程名(参数1,参数2);
例子:
call fun//

二、存储过程的参数类型

#mysql定义变量方法
语法格式:  set  @字段名=值
例如:
set @num=1
1、In ,传入参数
特点:读取外部变量值,传给存储过程来使用的!
例子:
set @num=1
create procedure fun(in sun int)
begin
    select sun;   #查询变量
set sun=2;
select sun;
end //
call fun(@num)

2、Out 参数  传出参数

特点:不读取外部变量,在存储过程执行完毕后保留新值

例子:

create procedure fun(out sun int)
begin
    set sun=1;
select sun;
end //
call fun(@abc)  #赋值给变量,把变量变成局部变量!
select @abc    #查询变量值

3、参数inout

特点:读取外部变量,在存储过程执行完后保留新值,传进来,又传出去!

例子:

set @ccc=4
create procedure fun(inout sun int)
begin
select sun;
set sun=3
end //
call fun(@ccc)  #传入变量
select @ccc     #查看变量的变化值

三、存储内部定义变量

#存储过程变量使用

MySQL使用declare 进行变量定义

变量定义:

declare var_name datatype

declare name varchar(200);

例子:

create procedure fun()
begin
   declare var_name int;
   set var_name=2;
   select var_name;
end //
call fun;
#存储过程的注释
"--" :单行注释
"/*..*/":一般用于多行注释
#查看和删除存储过程
show create procedure 过程名 \G  #查看单个
show  procedure status \g; #查看所有存储过程
drop procedure 过程名;

四、存储循环语句

1、while var <0 do --- end while

create procedure fun()
begin
   declare i int;
   set i=1;
   while i<3 do
      set i=i+1;
  select i;
end while;
end //
2、LOOP_LABLE:loop ...if i>1 then ...leave LOOP_LABLE end if--- end loop
use mysql
create procedure fun()
begin
  declare i int;
  set i=1;
  LOOP_LABLE:loop
  set i=i+1;
  select i;
  if i >4 then
leave LOOP_LABLE;
  end if;
  end loop;
end //
3、repeat ---until(条件)-- end repeat
create procedure fun(n1 int)
begin
repeat set @x=@x+1; #循环
insert into t_name values(@x);
until @x>n1  #达到条件就结束
end repeat;  #结束循环
end;;
call t2(5)

五、触发器

触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力

#触发器作用:

1.安全性

2.审计

3.实现复杂的非标准的数据库相关完整性规则。

4.实现复杂的数据完整性规则

5.实时同步地复制表中的数据

6.自动计算数据值

#触发器语法:

语法:

create  trigger 触发器名称  触发的时机  触发的动作  on 表名 for each row 触发器状态。

参数说明:

触发器名称:  自己定义

触发的时机: before /after  在执行动作之前还是之后

触发的动作 :指的激发触发程序的语句类型<insert ,update,delete>

each row:操作第一行我都监控着

触发器创建语法四要素:

1.监视地点(table) 

2.监视事件(insert/update/delete) 

3.触发时间(after/before) 

4.触发事件(insert/update/delete)

例子:

create table tb(id int,name vachar(10))
insert into tb(id,name)values(1,"aa")//
insert into tb(id,name)values(2,"aa")//
create trigger funn after insert on tb for each row set NEW.id=3


#注意,触发器不能对同一个张表使用

1. 非常遗憾,MYSQL中触发器中不能对本表进行 insert ,update ,delete操作,以免递归循环触发

2. 对于update 只能用set进行操作,insert与delete只能借助第二张表才能实现需要的目的

#查看和删除触发器

show create trigger fun \G #查看单个触发器

show create triggers   \G #查看所有的触发器

drop trigger fun #删除触发器