1.存储过程的基本概念
存储过程是一组为了完成特定功能的SQL语句集。
存储过程的优点:
(1)可增强SQL的功能和灵活性
(2)良好的封装性
(3)高性能
(4)降低网络负载
(5)存储过程可作为一种安全机制来确保数据库的安全性和数据的完整性
2.创建存储过程
(1)delimiter
Mysql中使用 delimiter 来修改默认的结束标志,为避免SQL执行到分号时就不再执行
存储过程执行完后再修改回来,避免影响其他SQL语句的执行
delimiter $$ -- 将结束符号修改为$$
(2)create procedure
MySQL中,使用 create procedure 来创建存储过程
语法格式:create procedure sp_name (proc_parament,) routine_body
其中proc_parament 的语法格式为: [ in | out |inout ] param_name type
其中
sp_name 为存储过程名称
proc_parament 为参数列表项
routine_body 为主体部分,这部分内容以 begin 开始,以关键字 end 结束。在主体中也可以嵌套 begin end 语法结构
delimiter $$
create procedure update_sex(
in sex1 int,
in id1 int
)
begin
update userinfo set sex=sex1 where id=id1;
end$$
3.存储过程体
在存储过程体中,可以使用各种SQL语句的组合,来封装数据库应用中复杂的业务逻辑,以实现数据库的灵活应用
(1)局部变量
在存储过程体重,可以定义临时变量,以存储过程中的临时结果
使用 declare 来定义局部变量
declare param_name type;
注意
局部变量只能存在于存储过程体的 begin…end 中声明
局部变量必须在过程体的开头处声明
使用 set 为局部变量赋值
set param=val;
(2)select…into
使用 select…into 语句把选定列的值直接存入到局部变量中
语法: select col_name into var_name from tb_name where …
注意,table表中返回的数据只能是一行
delimiter $$
create procedure update_sex(
in sex1 int,
in id1 int
)
begin
declare newname int; -- 定义变量
set newname='test1'; -- 为变量赋值
select name into newname from userinfo where id=id1; -- 将查询出来的值赋值给变量
update userinfo set name=newname where id=cid; -- 将变量的值更新到数据库中
end$$
(3)流程控制语句
在 MySQL 中,可以在存储过程体中,使用条件判断语句和循环语句用于控制 SQL 语句
(3.1)条件判断语句
常用的有 if then else 和 case 语句,用法类似于高级编程语言
(3.2)循环语句
常用的循环语句有 while 语句,repeat ,和 loop 语句
循环语句中也可以使用 iterate 退出当前循环,开始下一轮循环
(4)游标
使用 select into 语句时,若返回多条数据,则需要一一处理,此时就需要游标
游标是一个被select 语句检索出来的数据集。
(4.1)声明游标
语法:declare cursor_name cursor for select_statement
cursor_name 是要创建的游标名称
select_statement 用于指定 select 查询语句
(4.2)打开游标
在定义游标后,需要打开游标才能使用
语法 : open cursor_name
一个游标可以被打开多次
(4.3)读取数据
MySQL中,使用 fetch into 语句从游标中读取数据
语法: fetch cursor_name into var_name
delimiter $$
create procedure update_sex(
in newaddress varchar(50),
in id1 int
)
begin
declare address2 int; -- 定义变量
declare newaddress_arr cursor for (select address from userinfo); -- 定义游标
open newaddress_arr; -- 打开游标
fetch newaddress_arr into address2 ; -- 将游标的值付给变量,注意,变量的数据需要与申明游标时select中的列数一致
update userinfo set address=address2 where id=id1;
end$$
(4.4)关闭游标
close cursor_name
注意:游标不是 select 语句,是被 select 检索出来的结果集
游标只能用于存储过程或存储函数
(5)调用存储过程
MySQL中,使用 call 关键字,调用存储过程
(6)删除存储过程
dropprocedure sp_name
存储函数与存储过程一样,都是SQL语句和过程式语句组成的代码片段。
与存储过程的区别
(1)存储函数不能用于输出参数,这是因为存储函数自身就是输出参数。
(2)可以直接对存储函数进行调用且不需要使用 call 语句
(3)存储函数必须包含一个 return 语句。
1.创建存储函数
MySQL中,使用 create function 语法创建存储函数
create function fun_name([param]) returns type fun_body
其中,param 的语法格式为 param_name type
(1)fun_name 表示函数名,注意不能与存储过程名称重复
(2)param 表示存储函数的参数列表,只需要指定名称和类型即可,无需指定 in 、out inout
(3)returns 子句用于申明函数返回值的数据类型,type 用于指定类型
(4)fun_body用于表示函数的主体部分,内容与存储过程相同。
(5)主体中必须包含一个return value 语句,value 用于指定存储函数的返回值。
delimiter $$ -- 修改结束符
create function get_info_sex(sid int) -- 定义存储函数名称及参数
returns int --定义返回值类型
DETERMINISTIC
begin
declare s_sex int; -- 定义临时变量
select sex into s_sex from student where id=sid; -- 查询并赋值
if s_sex is null then
return (select '没有该学生'); -- 未检索到则返回提示
else
return (select s_sex); -- 检索到则返回数据
end if;
end$$
2.调用存储函数
存储函数创建完成之后就可以像使用其他系统函数一样使用 select 对其进行调用
select (case get_info_sex(1) when 0 then '女' when 1 then '男' else '未知' end ) as sex
3.删除存储函数
存储函数被创建后,会保留在服务器上以供使用,直至被删除。
drop function [ if exists ] fun_name
为防止因为删除不存在的存储函数而引发的错误,可以使用 if exists 关键字
本章内容较多,MySQL中存储过程和存储函数的用法也很多,这里仅做粗略的使用介绍。