码迷,mamicode.com
首页 > 数据库 > 详细

MySQL-存储过程与触发器

时间:2018-10-05 00:54:25      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:用户   算数   table   char   统一   int   变化   标准   调用   

 

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 #删除触发器

MySQL-存储过程与触发器

标签:用户   算数   table   char   统一   int   变化   标准   调用   

原文地址:https://www.cnblogs.com/sunjingjingking/p/9743832.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!