mysql存储程序相关用法总结

本文参考自 《深入浅出Mysql》
mysql存储程序相关用法

  • 存储函数

存储函数将向调用者返回结果

存储函数创建实例
mysql> delimiter $    //设置$为分隔符
mysql> create function get_carname(car_id int)   //创建函数 参数为car_id
    -> returns varchar(100)     //函数返回值
    -> reads sql data
    -> begin
    -> return (select name from car_info where id = car_id);  
    -> end$       //结束符
Query OK, 0 rows affected
mysql> delimiter ;  
mysql> select get_carname(100);  //调用函数getcarname(100);
+------------------------------------------------+
| get_carname(100) |
+------------------------------------------------+
| 起亚K2 2012款 两厢 1.6L AT Premium纪念版111122 |
+------------------------------------------------+
1 row in set

存储函数查看
show function status;
show create function get_carname;
 show function status like ‘get_car%‘;

存储函数删除
drop function get_carname;

  • 存储过程

存储过程创建实例
mysql> create procedure show_name(car_id int)
    -> begin
    -> select name from car_info where id = car_id;
    -> update car_info set name = ‘123456‘ where id = car_id;
    -> end$
1304 - PROCEDURE show_name already exists
mysql> create procedure show_carname(car_id int)
    -> begin
    -> select name from car_info where id = car_id;
    -> update car_info set name = ‘123456‘ where id = car_id;
    -> end$
Query OK, 0 rows affected
mysql> call show_carname(100);
    -> $
+------------------------------------------------+
| name |
+------------------------------------------------+
| 起亚K2 2012款 两厢 1.6L AT Premium纪念版111122 |
+------------------------------------------------+
1 row in set

存储过程的参数类型
IN参数:调用者把IN参数传值给过程
OUT参数:过程把值赋值给OUT参数

mysql> create procedure get_carname(in car_id int,out car_name varchar(100))
    -> begin
    -> select name into car_name from car_info where id = car_id;
    -> end$
Query OK, 0 rows affected
mysql> delimiter ;
mysql> call get_carname(100,@car_name);
Query OK, 0 rows affected
mysql> select @car_name;
+-----------+
| @car_name |
+-----------+
| 123456 |
+-----------+
1 row in set

存储过程特征值介绍

LANGUAGE SQL                   默认,routine_boyd由SQL组成

[NOT]DETERMINISTIC         指明存储过程的执行结果是否是确定的,默认不确定

CONSTAINS SQL                  子程序包含SQL,但不包含读写数据的语句,默认

NO SQL                                 子程序中不包含SQL语句

READS SQL DATA               子程序中包含读数据的语句

MODIFIES SQL DATA        子程序中包含了写数据的语句

SQLSECURITY {DEFINER|INVOKER} 指明谁有权限执行。

    DEFINER    只有定义者自己才能够执行,默认

    INVOKER    表示调用者可以执行


存储过程中变量的使用
变量定义:declare procedure_temp varchar(100); 
变量赋值:set procedure_temp  = ‘hello‘;
也可以将查询结果赋值给变量:
select name into procedure_temp  ;

mysql> create procedure procedure_test()
    -> begin
    -> declare continue handler for sqlstate ‘23000‘ set @x1 = 1;    
    -> set @x2 = 2;
    -> insert into web_car_brands(name) values(‘dazhong‘);
    -> set @x2 = 3;
    -> end$
红色部分表示mysql执行是遇到错误、异常、警告时采取的方式,目前支持continue 和exit两种方式
错误类别包括:sqlwarning,not found ,sqlstate

存储过程中流程控制语句的使用,待完善......

存储过程中光标的使用
create procedure curser_test()
    -> begin
    -> declare count int;
    -> declare car_name varchar(100);
    -> declare cur cursor for select name from car_info where id <10;  //声明光标
    -> declare exit handler for not found close cur;
    ->
    -> set @x1 = 0;
    -> set @x2 = 0;
    ->
    -> open cur; /打开光标
    ->
    -> repeat
    -> fetch cur into car_name;  // fetch 光标
    -> if(car_name == ‘凯迪拉克‘)
    -> then set @x1 = 1;
    -> else
    -> set @x2 = 1;
    -> end if;
    -> until 0 end repeat;
    -> close cur; //关闭光标
    -> end$

  • 触发器

当某个数据表被INSERT、DELETE、UPDATE时,触发器将自动执行。

触发器创建实例
mysql> delimiter $
mysql> create trigger trigger_test  //触发器名称为trigger_test
    -> after insert on car_info for each row begin  //在插入操作之后执行
    -> insert into web_car_brands(name) values(‘dahzong‘); //要执行的动作
    -> end;
    -> $

触发器被触发的语句如下:INSERT、DELETE、UPDATE

查看触发器
 show triggers;
删除触发器
drop trigger trigger_test;
触发器使用注意
触发器按照BEFORE触发器、行操作、AFTER触发器的顺序执行,其中任何一部发生错误的操作都不会继续执行剩下的操作。
对于事务操作,如果期间发生错误,整个事务回滚,对于非事务,如果发生错误,那么已经执行的部分将无法回滚。

  • 视图

视图创建实例
mysql> create view view_test as  //创建视图view_test
    -> select name from car_info where id = 100;
Query OK, 0 rows affected

查看视图
不能通过show views方式查看视图,通过show tables 可以查看到所有的表和视图
show table status like ‘view%‘;
show create view view_test;
select * from information_schema.views where table_name = ‘view_test‘;   //通过INFORMATION_SCHEMA.VIEWS 查看

视图删除
 drop view view_test;

mysql视图若干限制
  1. from关键字后不能包含子查询
  2. 以下类型视图补课更新:聚合函数(SUM、MIN、MAX、COUNT)、DISTINCT、GROUP BY、HAVING、UNION或者UNION ALL
  3. SELECT中包含子查询
  4. JION
  5. FORM一个补课更新的视图
使用视图的优点:
  1. 数据独立:可以屏蔽表结果变化对用户的影响,源表增加列对视图没有影响,源表修改列,只需修改视图对应列即可
  2. 安全:用户只能访问视图呈现的结果集,可以限制到某个行、某个列
  3. 简单:用户使用视图不许关心其背后对应的表结果、关联条件、筛选条件,直接呈现对应条件的结果集

  • 事件

事件调度器可以安排数据库在预订的时间执行某个事件,默认情况下事件调度器不会开启,
查看事件调度器状态: show variables like ‘event_scheduler‘;
开启事件调度器:set global event_scheduler = ON;

事件创建实例
mysql> create event expire_web_session  //创建事件expire_web_session  
    -> on schedule every 4 hour     //每四小时执行一次
    -> do
    -> delete from car_info where publish_date < current_timestamp - interval 1 day;  //要执行的事件
Query OK, 0 rows affected

停止某个事件
mysql> alter event expire_web_session disable;
开启某个事件
alter event expire_session enable;

mysql存储程序相关用法总结,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。