存储过程与存储函数
存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。存储过程和函数可以避免开发人员重复的编写相同的SQL语句。而且,存储过程和函数是在MySQL服务器中存储和执行的,可以减少客户端和服务器端的数据传输。
创建存储过程和函数是指将经常使用的一组SQL语句的组合在一起,并将这些SQL语句当作一个整体存储在MySQL服务器中。
一、存储过程
存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
存储过程通常有以下优点:
存储过程增强了SQL语言的功能和灵活性。
存储过程允许标准组件是编程。
存储过程能实现较快的执行速度。
存储过程能过减少网络流量。
存储过程可被作为一种安全机制来充分利用。
与函数相同之处在于:存储过程的参数也是局部变量,也需要提供参数的数据类型;与函数不同的是,存储过程有三种类型的参数:in参数、out参数以及inout参数。
in代表输入参数(默认情况下为in参数),表示该参数的值必须由调用程序指定;
out代表输出参数,表示该参数的值经存储过程计算后,将out参数的计算结果返回给调用程序;
inout代表即是输入参数,又是输出参数,表示该参数的值即可以由调用程序指定,又可以将inout参数的计算结果返回给调用程序。
1.创建事务:
创建存储过程的语法格式
create procedure 存储过程名(参数1,参数2,…)
[存储过程选项]
begin
存储过程语句块;
end;
delimiter $$
create procedure sele(in title varchar(60))
begin
select * from t_task where title = title;
end $$
2.执行事务:
CALL sele("cyc")
3.查看存储过程的定义
1)使用show procedure status like 'selinto' 命令查看存储过程的定义。
2)查看某个数据库(例如choose数据库)中的所有存储过程名,可以使用下面的SQL语句。select name from mysql.proc where db = 'choose' and type = 'procedure';
3)使用MySQL命令“show create procedure 存储过程名;”可以查看指定数据库指定存储过程的详细信息。例:“show create procedure selinto\G;”
4)存储过程的信息都保存在information_schema数据库中的routines表中,可以使用select语句查询存储过程的相关信息.
例如下面的SQL语句查看的是get_choose_number_proc()存储过程的相关信息。
select * from information_schema.routines where routine_name= 'selinto'\G;
4.定义条件和处理程序
定义条件和处理程序是事先定义程序执行过程中可能遇到的问题。并且可以在处理程序中定义解决这些问题的办法。这种方式可以提前预测可能出现的问题,并提出解决办法。这样可以增强程序处理问题的能力,避免程序异常停止。MySQL中都是通过DECLARE关键字来定义条件和处理程序。
5.在存储过程中使用游标
游标允许应用程序对查询语句select返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作。
游标的使命周期必须按如下顺序进行:
1.创建游标 DECLARE cursor_name CURSOR FOR select_statement这个语句声明一个游标。也可以在子程序中定义多个游标,但是一个块中的每一个游标必须有唯一的名字。要注意的是SELECT语句不能有INTO子句。
2.打开游标 OPEN cursor_name。
3.使用游标 FETCH cursor_name INTO re_id, re_salary, re_comm;这个语句用来打开游标读取下一行(如果有下一行的话),并且前进光标指针。
4.关闭游标 CLOSE cursor_name;这个语句关闭先前打开的游标。如果未被明确地关闭,游标在它被声明的复合语句的末尾被关闭。
二、存储函数
创建存储函数的使用CREATE FUNCTION语句,语法格式和创建存储过程相似:
CREATE FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
语法说明:
func_parameter为存储函数的函数,只能是IN类型的参数。
RETURNS type是存储函数返回值的数据类型。
routine_body是存储函数的过程体,用法和存储过程一致。要注意的是,在存储函数过程体中必须包含一个RETURN语句用以返回数据。
存储函数使用SELECT语句调用,调用语法格式为:
SELECT sp_name ([func_parameter[,...]])
实例:
delimiter $$
//创建存储函数 传入参数 用来更加输入的title定义查询条件
CREATE FUNCTION fanname(title varchar(60))
//返回类型
RETURNS varchar(256)
BEGIN
//定义条件和处理程序 变量:newcon
declare newcon VARCHAR(256);
//查询语句
SELECT context INTO newcon FROM t_task WHERE title = title;
//返回值
RETURN newcon;
end $$
执行语句:
select fanname ("cyc");
存储函数的修改和删除
存储函数的修改和删除方法和存储过程相似,在这里不再详述。
其中修改存储函数语法为:
ALTER FUNCTION sp_name [characteristic ...]
删除存储函数语法为:
DROP FUNCTION [IF EXISTS] sp_name
三、存储过程与函数之间的共同特点在于:
应用程序调用存储过程或者函数时,只需要提供存储过程名或者函数名,以及参数信息,无需将若干条MySQL命令或SQL语句发送到MySQL服务器,节省了网络开销。
存储过程或者函数可以重复使用,可以减少数据库开发人员,尤其是应用程序开发人员的工作量。
使用存储过程或者函数可以增强数据的安全访问控制。可以设定只有某些数据库用户才具有某些存储过程或者函数的执行权。
四、存储过程与函数之间的不同之处在于:
函数必须有且仅有一个返回值,且必须指定返回值数据类型(返回值类型目前仅仅支持字符串、数值类型)。存储过程可以没有返回值,也可以有返回值,甚至可以有多个返回值,所有的返回值需要使用out或者inout参数定义。
函数体内可以使用select…into语句为某个变量赋值,但不能使用select语句返回结果(或者结果集)。存储过程则没有这方面的限制,存储过程甚至可以返回多个结果集。
函数可以直接嵌入到SQL语句(例如select语句中)或者MySQL表达式中,最重要的是函数可以用于扩展标准的SQL语句。存储过程一般需要单独调用,并不会嵌入到SQL语句中使用(例如select语句中),调用时需要使用call关键字。