一、存储函数
1、定义存储函数
create function 函数名(参数1 数据类型1 [,参数2 数据类型2...])returns 返回值类型 begin
任意系列SQL语句
return 返回值;
end
1)参数只有输入类型,在存储过程中参数可以是in(输入)、out(输出)、inout(输入输出)三种类型
2)向调用者返回结果值
如计算自然数阶乘
delimiter // 中间有空格
2、确认创建成功的存储函数
mysql> show function status\G --可以查看是否创建成功
mysql> show create function fn_factorial\G --查看函数的定义内容,即源码
3、调用函数
SELECT fn_factorial(5),fn_factorial(3);
二、触发器
1、创建触发器
create trigger 触发器名 发生时刻 事件名
on 表名 for each row
begin
任意系列sql语句
end
1)指定成为触发器调用方的表名
触发器不是直接被调用运行的,而是针对具体的表的操作时被调用,也就是说在创建触发器时必须指定一个表
2)决定触发器运行的时刻
3)[for each row]为固定值
2、定义触发器
如:建一个触发器用来给删除的数据备份
先建一个与原表一样的空表customer_history
mysql> delimiter //
mysql> create trigger trg_customer_history after delete --触发器名
-> on customer for each row
-> begin
-> insert into customer_history (mid,nam,birth,sex)
-> values(old.mid,old.nam,old.birth,old.sex);
-> end
-> //
3、确认创建触发器完成
mysql> show triggers\G
项目 | 说明 |
Trigger | 触发器名 |
Event | 启动触发器的事件名(insert|update|delete) |
Table | 触发器启动对象表名 |
Statement | 触发器启动时执行的命令 |
Timing: | 启动时刻(before|after) |
Created | 未使用项目(始终为null) |
sql_mode | 触发器执行时的sql模式 |
Definer | 触发器作者 |
character_set_client | 从客户端传过来的查询的字符编码 |
collation_connection | 当前连接中使用的对照顺序 |
Database Collation | 数据库的对照顺序 |
4、删除触发器
drop trigger 触发器名
5、测试触发器
三、游标
1、创建游标
mysql> delimiter //
mysql> create procedure sp_cursor(out p_result text)
-> begin
-> declare flag bit default 0;
-> declare tmp varchar(20);
--声明游标
-> declare cur cursor for select distinct depart from employee;
-> declare continue handler for not found set flag=1;
--打开游标
-> open cur;
--从游标中读取一行数据
-> while flag != 1 do
-> fetch cur into tmp;
--标志变量flag非1时进行如下处理
-> if flag != 1 then
-> set p_result =concat_ws(',',p_result,tmp);
-> end if;
-> end while;
--关闭游标
-> close cur;
-> end
-> //
1)声明游标
declare 游标名 cursor for select语句
2)打开游标
open 游标名
3)从指针中取得记录数据
fetch 游标名 into 变量名
4)读取了所有游标记录后的处理
declare 处理类 handler for 例外的种类 例外发生时的处理
5) 关闭游标
close 游标名
2、用游标后,测试存储过程