您的位置:首页 > 数据库 > MySQL

mysql的存储过程,存储函数,游标,流程控制

2015-02-27 09:42 441 查看
存储过程

MySQL5.0终于开始已经支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。MySQL5.0终于开始已
经支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。

1.存储过程的优点

(1).存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
(2).存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
(3).存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
(4).存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。
(5).存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。
2.语法
MySQL存储过程创建的格式:CREATEPROCEDURE过程名([过程参数[,...]])[特性...]过程体
函数
1:语法
createfunction函数名称(参数)|||||||||||return函数类型(函数类型的返回值)
游标

mysql游标还有它的一些特性:
1.服务器端
有些数据库服务器可以同时运行服务器端和客户端游标。服务器游标在数据库中管理,而客户端游标可以在数据库之外的应用程序(程序语言等)中生成,控制。MySQL只支持服务器端游标,也就是说,所有的游标必须和存储过程一样,事先写在数据库中,在各语言中只能进行请求调用。
2.只读
游标可以是可读和可写的。只读游标可以从数据库中读取数据,而可写游标可以更新由游标指向的数据。MySQL只支持只读游标,也就是说,只能进行数据查询。
3.敏感
游标可以是敏感的,也可以是不敏感的。敏感游标引用数据库中的实际数据,而不敏感的游标指向在创建游标时建立的数据临时副本。MySQL只支持敏感游标,因为是只读的,所以不用考虑破坏数据,因此直接对数据进行操作也没问题。
4。只向前
高级的游标实现可以向后和向前遍历数据集,跳过记录,完成大量其它的导航任务。目前MySQL游标只是向前的,意味着只能向前遍历数据集。此外,MySQL游标一次只能向前移动一条记录,不能跳过。

流程控制
1.分支ifcase,
2.循环whilerepeatloop,
示例

      <prename="code"class="sql">dropprocedureifexistsmy_pro22;
createproceduremy_pro22(
begin declarememberid2int; declareis_fountintdefault1; declaremy_curcursorforselectdistinctallorder.memberidfrom(selectmemberidasmemberid,userphoneasphonefromkeepcar_orderwherekeepcar_order.cust_status=6unionselectmemberidasmemberid,userphoneasphonefromkeepcar_giftpack_order)asallorderwhereallorder.memberidnotin(selectmemberidfromkeepcar_couponswherekeepcar_coupons.ifuse=1andendtime>'2015-04-0323:59:59'); declarecontinuehandlerfornotfoundsetis_fount=0;//为游标绑定循环完毕的标识 openmy_cur; lab1:loop fetchnextfrommy_curintomemberid2; ifis_fount=0thenleavelab1; else insertintokeepcar_coupons(createtime,memberid,money,coutype,remarks,usetime,orderid,endtime,ifuse,sourcetype,lbcodeid)VALUES(now(),memberid2,30,'1','手动添加',null,null,'2015-04-3023:59:59','1','0',null); endif; endloop; closemy_cur; end;




drop functionifexists my_fun;
create function  my_fun(datetime varchar(50)) returns varchar(50)
begin
     declaredate_outvarchar(50);
     setdate_out=datetime;
     return date_out;
 end

<p>DROPPROCEDUREIFEXISTS my_PRO</p><p>CREATEPROCEDUREmy_PRO(INs1INT,OUTs2INT,INOUTs3VARCHAR(10))
BEGIN
DECLAREx1VARCHAR(10)DEFAULT'thisisx1';
DECLAREx2VARCHAR(10)DEFAULT'thisisx2';
SETs1=11;
SETs2=22;
SETs3='iss3';
--if语法
IFs1=11ANDs2=12THEN
  SELECTs1,s2;
ENDIF;</p><p>IFs3='s3'ORs1=s2THEN
 SELECTs3;
ELSE
 SELECTs1,s2,s3;
ENDIF;</p><p>--case语法
CASEs3
WHEN's1'THEN
  SELECT'thisiss1';
WHEN's2'THEN
   SELECT'thisiss2';
ELSE
   SELECT'thisiss3';
ENDCASE;</p><p>--while循环
WHILEs1>1DO
   SETs1=s1-1;
ENDWHILE;
SELECTs1;</p><p>--repeat循环语句
--与while不同的是while满足条件就执行,repeat始终执行直到满足条件终止
REPEAT 
SETs1=s1-1;
UNTILs1=1 
ENDREPEAT;
SELECTs1;</p><p>
/*
LOOP循环
LOOP没有循环条件,会不停的循环直到遇到"LEAVEZiDingYi;""ZiDingYi"是自定义的LOOP标记
*/
ZiDingYi:LOOP
SETs1=s1+1;
IFs1=5THEN
LEAVEZiDingYi;
ENDIF;
ENDLOOP;
SELECTs1;
END</p>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: