数据库编程:存储过程和储存函数
存储过程
⼀,存储过程的基本概念
存储过程是⼀组为了完成某项特定功能的SQL语句集,其实质上就是⼀段存储在数据库中的代码,他是由声明式SQL语句(如
create,uopdate,seletct等语句)和过程式SQL语句(如if…then…else控制结构语句)组成。这组语句集经过编译后会存储在数据库中,⽤户只需要指定存储过程的名字并给定参数就可以随时调⽤并执⾏,⽽不必重新编译,因此这种通过定义⼀段程序存储在数据库中的⽅式,可加⼤数据库操作语句的执⾏效率。
⼀个存储过程是⼀个可编程的函数,同时可看作是在数据库编程中对⾯向对象⽅式的模拟,它允许控制数据的访问⽅式。使⽤存储过程通常具有以下优点:
1.可增强SQL语⾔的功能和灵活性;
2.良好的封装性
3.⾼性能
4.可减少⽹络流量
5.存储过程可作为⼀种安全机制来确保数据库的安全性和数据的完整性
⼆,创建存储过程并且调⽤存储过程
在mysql数据库中通过命令⾏的⽅式来创建存储过程时,经常⽤到⼀个⼗分重要的命令,即delimiter命令,使⽤delimiter命令,将mysql 语句的结束语标志临时修改为其他符号,从⽽使mysql服务器可以完整的处理存储过程中所以的mysql语句,⽽后可通过delimiter命令再将mysql语句的标志符号改回默认符号,即(;)。
delimiter !!//⾃定义整个存储过程的结束符为!!
delimiter ;//如若希望换回默认的结束符号,就执⾏这条命令
在mysql中,创建存储过程的语法是:
create procedure sp_name(proc_parameter,)
routine_body
格式含义:
sp_name:存储过程的名称,默认在当前数据库中创建
proc_parameter:指定存储过程的参数列表,mysql存储过程⽀持三种类型的参数,即输⼊参数,输出参数和输⼊/输出参数,分别⽤(in,out,inout)表⽰
routine_body:表⽰存储过程的主体部分,这个部分以begin开始,以end结束
举例⼀个应⽤题,在数据库mysql_test中创建⼀个存储过程为sp_update_sex,并且将客户id号为909的客户性别修改为男性“M”
use mysql_test;//应⽤⼀个数据库
delimiter !!//⾃定义整个过程的结束符
create procedure sp_update_sex(in cid int,in csex char(1))
begin
update customers set cust_sex=csex where cust_id=cid;
end!!
call sp_update_sex(909,"M");//调⽤存储函数
删除存储过程
存储过程在被创建后,会被保存在服务器上以供使⽤,直⾄删除,在mysql中可以使⽤drop procedure语句来删除数据库中已经创建的存储过程,举例:
drop procedure sp_update_sex;
//防⽌因删除不存在的存储函数⽽引发的错误,可加上关键字if exists
drop procedure if exists sp_update_sex;
存储函数
存储函数和存储过程⼀样,都是由sql语句和过程式语句所组成的代码⽚段,并且可以被应⽤程序和其他sql语句调⽤
存储过程和存储函数和区别:
1.存储函数不能拥有输出参数,这是因为存储函数⾃⾝就是输出参数,⽽存储过程可以拥有输出参数
2.可以直接对存储函数进⾏调⽤,且不需要使⽤call语句,⽽对存储过程进⾏调⽤需要⽤call语句
3.存储函数中必须包含⼀条return语句,⽽这条特殊的sql语句不允许包含于存储过程中
创建存储函数
在mysql中,可以使⽤create function语句来创建⼀个存储函数,语法格式为:
create function sp_name()//func_parameter的语法格式为:parameter_name type
returns type
routine_body
语法格式:
sp_name:存储函数的名称,注意的是存储函数不能和存储过程同⼀个名字
func_parameter:存储函数的参数,注意这的参数只有名称和类型,不能指定关键字(in,out,inout)
returns:⽤于声明存储函数返回值的数据类型,type代表返回值的数据类型
routine_body:存储函数的主题部分,也是存储函数体。
应⽤题,在数据库mysql_test中创建⼀个存储函数,要求该函数能根据给定的客户id号返回客户的性别,如果数据库中没有给定的客户id 号,则返回“没有该客户”
use mysql_test;
delimiter !!
create function fn_search(cid int)
returns char(2)
deterministic
begin
declare sex char(2);
select cust_sex into sex from customers
where cust_id=cid;
if sex is null then
return(select"没有该客户");
else if sex="F" then
return(select"⼥");
else return(select"男");
end if;
end if;
end !!
调⽤存储函数,使⽤关键字select调⽤
应⽤题,调⽤数据库mysql_test中存储函数fn_search。
select fn_search<904>;
删除存储函数
在存储函数被创建后,会被保存在服务器上以供使⽤,直⾄被删除,删除存储函数⽅法和删除存储过程的⽅法基本是⼀样的。使⽤drop function语句来删除
mysql存储过程使用drop procedure fn_search;
//防⽌因删除不存在的存储函数⽽引发的错误,可加上关键字if exists drop procedure if exists fn_search;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。