mysql存储过程与存储函数
存储过程和存储函数是mysql支持的过程式数据库对象。可以提高数据库的处理速度,提高数据库编程的灵活性。
一、存储过程
1、概述
一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程有参数)来调用执行它。
2、存储过程
可以使用create procedure语句创建存储过程
语法格式:
create procedure <过程名> ([过程参数[,...]]) <过程体>
[过程参数[,...]]格式
[in|out|input] <参数名> <类型>
参数说明:
实例:
在数据库mytest中,创建一个存储过程,存储的功能是依据学生的id,修改studentes的姓名。
use mytest;
delimiter ??
create procedure update_name(in cid int,in cname char(50))
Begin
update students set student_name=cname where student_id=cid;
End ??
3、存储过程体
可以使用各种sql语句与过程式语句的结合。对数据库应用中的复杂业务逻辑和处理规则进行封装。
3.1 局部变量
在存储过程体中可以声明局部变量,用来存放产生的临时结果。
语法格式:
declare <变量名>[,...]<类型> [default<默认值>]
实例:
声明一个字符型局部变量xname,默认值为李明
declare xname varchar(5) default '李明';
使用说明:
局部变量只能在存储过程体begin...end 语句中声明
局部变量在存储过程体开头处声明
3.2 set语句
变量声明后,可以使用set语句为局部变量赋值
举例:为已声明的变量xname赋值为"王杰";
set xname='王杰';
3.3 select…into…语句
将选定列的值直接存储到局部变量中,存储过程体中的select…into只能返回一行数据。
语法格式:
select <列名>[,...] into <变量名>[,...] <其他>
实例:
给局部变量x,y分别赋数据库test中表t1的id,data值
select id,data into x,y from test.t1 limit 1;
3.4流程控制语句
在存储过程体中使用以下五种控制语句流程的过程式sql语句
(1)条件判断句
if <判断语句> then <语句>
[else <判断条件> then <语句>]
[else <语句>]
end if
(2)条件判断句case
case <参数>
when <参数> then <语句>
[when <参数> then <语句>]
[else 语句]
end case
或
case
when <判断条件> then 语句
[when <判断条件> then <语句> eles <语句>]
end case
(3)循环语句loop
<标签> loop
<语句>
end loop [标签]
(4)循环语句while
<标签> while <判断条件> do
<语句>
end while <标签>
(5)循环语句repeat
<标签> repeat
<语句>
until <判断条件>
end repeat <标签>
3.5 游标
是一个被select语句检索出来的结果集,在存储了游标后,应用程序或用户就可以根据需要滚动或浏览其中的数据
(1)声明
declare <游标名> cursor for <select语句>
指定一个select语句,会返回一行或多行数据
这里的select语句不能有into语句
(2)打开游标
将游标连接到由select语句返回的结果集中。
open <游标名>
(3)读取数据
使用fetch…into语句从游标中读取数据。fetch语句是将游标指向的一行数据赋给一些变量,这些变量的数目必须等于声明游标时select子句中选择列的数目。游标相当于一个指针,指向当前的一行数据。
fetch <游标名> into <变量名1>[变量名2]...
(4)关闭游标
使用close语句关闭游标
close <游标名>
4、调用存储过程
使用call语句在程序、触发器或者其他存储过程中调用它
call <过程名>[(参数,...)]
5、删除存储过程
在被创建后,保存在数据库服务器中
drop procedure <过程名>
二、存储函数
由sql语句和过程式语句组成的代码片段,并且可以被应用程序和其他sql语句调用。
1、创建存储函数
语法格式:
create function <函数名>(<参数1><类型1>[,...])
return <类型>
<函数主体>
实例:根据给定的student_id查找学生并返回该学生的姓名,如果没有则返回“没有该学生”
use test;
delimiter ??
CREATE FUNCTION fn_search ( cid INT ) RETURNS CHAR ( 50 ) DETERMINISTIC BEGIN
DECLARE NAME CHAR ( 50 );
SELECT student_name INTO NAME FROM students WHERE student_id = cid;
IF NAME IS NULL THEN
RETURN (
SELECT('没有该学生' ));
else RETURN ( NAME );
END IF;
END ??
2、调用存储函数
如同调用系统内置函数一样,使用关键字select。
语法格式:
select <存储函数名>([<参数>[....]])
实例:调用fn_search,查询student_id为1的学生,并返回学生姓名
select fn_search(1);
3、删除存储函数
语法格式:
drop function [if exists] <存储函数名>