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

         存储过程

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

        1.存储过程的优点

(1).存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

(2).存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。

(3).存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。

(4).存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。

(5).存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

2.语法

MySQL存储过程创建的格式:CREATE PROCEDURE 过程名([过程参数[,...]]) [特性...] 过程体

函数

1: 语法

create  function     函数名称(参数)|||||||||||   return 函数类型(函数类型的返回值)

游标

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

流程控制

    1.分支 if case,

    2.循环 while repeat loop,

示例

   

       <pre name="code" class="sql">   drop  procedure  if exists   my_pro22;
   create procedure my_pro22( 
begin  
   declare memberid2 int ;   
   declare is_fount  int  default 1; 
   declare  my_cur  cursor   for  select    distinct   allorder.memberid   from   (select  memberid   as  memberid  ,userphone  as  phone    from  keepcar_order  where  keepcar_order.cust_status=6       union select memberid  as  memberid ,userphone  as  phone      from keepcar_giftpack_order       )       as  allorder where  allorder.memberid  not in (select    memberid   from  keepcar_coupons   where  keepcar_coupons.ifuse=1  and endtime>'2015-04-03 23:59:59' );
   declare continue  handler for not  found    set is_fount=0; //为游标绑定循环完毕的标识
   open  my_cur;
  

 lab1:loop
             fetch next from my_cur into  memberid2;
              if is_fount=0 then  leave lab1;
              else 
                insert  into  keepcar_coupons( createtime,memberid,money,coutype,remarks,usetime,orderid,endtime,ifuse,sourcetype,lbcodeid) VALUES   ( now() , memberid2  ,30, '1', '手动添加', null, null, '2015-04-30 23:59:59', '1', '0', null );
              end if;
             end  loop; 
 close my_cur;
 end;

 

 

  

   drop  function if exists  my_fun;
   create  function   my_fun (datetime  varchar(50))  returns  varchar(50)
   begin 
      declare date_out varchar(50);
      set date_out=datetime;
      return  date_out;
   end
 
<p>DROP PROCEDURE IF EXISTS  my_PRO</p><p>CREATE PROCEDURE my_PRO (IN s1 INT,OUT s2 INT,INOUT s3 VARCHAR(10))
BEGIN
DECLARE x1 VARCHAR(10) DEFAULT 'this is x1'; 
DECLARE x2 VARCHAR(10) DEFAULT 'this is x2'; 
SET s1 = 11;
SET s2 = 22;
SET s3 = 'iss3';
--if语法
IF s1 = 11 AND s2 = 12 THEN
   SELECT s1,s2;
END IF;</p><p>IF s3 = 's3' OR s1 = s2 THEN
  SELECT s3;
ELSE 
  SELECT s1,s2,s3;
END IF;</p><p>--case语法
CASE s3
WHEN 's1' THEN
   SELECT 'this is s1';
WHEN 's2' THEN
    SELECT 'this is s2';
ELSE
    SELECT 'this is s3';
END CASE;</p><p>--while循环
WHILE s1>1 DO
    SET s1=s1-1;
END WHILE; 
SELECT s1;</p><p>--repeat循环语句
--与while不同的是while满足条件就执行,repeat始终执行直到满足条件终止
REPEAT  
SET s1 = s1-1; 
UNTIL s1=1  
END REPEAT; 
SELECT s1;</p><p>
/*
LOOP循环
LOOP没有循环条件,会不停的循环直到遇到 "LEAVE ZiDingYi;" "ZiDingYi"是自定义的LOOP标记
*/
ZiDingYi:LOOP
SET s1 = s1+1;
IF s1 = 5 THEN
LEAVE ZiDingYi;
END IF;
END LOOP;
SELECT s1;
END</p>

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值