浅谈一下mySql中创建存储过程

      首先说一下为什么要使用存储过程,存储过程是在数据库中预编译的程序代码,其执行效率显然要比从程序端传过去的sql语句要高的多,这样既可以节省网络带宽,又可以加快sql的执行速度,可以很好的提高系统的性能。缺点是扩展性差,一个存储过程只能实现一个特定的功能,对于千变万化的curd操作来说,每种操作写一个存储过程实在是非常的繁琐,工作量大大加大。所以存储过程最好是应用在复杂且频繁并固定的操作上。

     下面是我写的一个比较复杂的存储过程(mySql下的),以此为例浅谈一下我学到的东西。

      DELIMITER  //
      create procedure findByCity(in basic_City_id char(36), in pageIndex int, in pageLength int)
      begin
      declare beginNum int default 0;
      if pageLength > 0 then
         set beginNum = (pageIndex - 1) * pageLength;
         select basic_School.*
         from basic_School, basic_County, basic_City
         where basic_School.fk_County_Id = basic_County.id
            and basic_County.fk_City_Id = basic_City.id
            and basic_City.id = basic_City_id
         order by basic_School.name asc
         limit beginNum, pageLength;
     else  
        select basic_School.*
        from basic_School, basic_County, basic_City
        where basic_School.fk_County_Id = basic_County.id
           and basic_County.fk_City_Id = basic_City.id
           and basic_City.id = basic_City_id
        order by basic_School.name asc;
    end if;
   end
   //
   DELIMITER ;

  1. 首先理解一下这个 DELIMITER  //,这叫声明分隔符,对于mySql中写存储过程必须要用这个进行包裹,否则就会报错。

   2.在存储过程的括号里可以添加入参和出参,入参前面加in,出参前面加out,如果返回的是一条数据就不要使用出参了,存储过程会自动返回一条数据。

   3.存储过程中可以声明变量如declare beginNum int default 0;但是变量要先声明后赋值如 set beginNum = (pageIndex - 1) * pageLength;

   4.可以添加排序和分页order by basic_School.name asc  limit beginNum, pageLength;

   5.可以使用控制语句如if ... then...else if ...then...else...end if;

   6.存储过程中的操作符

   算术运算符

       +     加   SET var1=2+2;       4
      -     减   SET var2=3-2;       1
      *     乘   SET var3=3*2;       6
      /     除   SET var4=10/3;      3.3333
      DIV   整除 SET var5=10 DIV 3;  3
      %     取模 SET var6=10%3 ;     1

    比较运算符

>            大于 1>2 False
<            小于 2<1 False
<=           小于等于 2<=2 True
>=           大于等于 3>=2 True
BETWEEN      在两值之间 5 BETWEEN 1 AND 10 True
NOT BETWEEN  不在两值之间 5 NOT BETWEEN 1 AND 10 False
IN           在集合中 5 IN (1,2,3,4) False
NOT IN       不在集合中 5 NOT IN (1,2,3,4) True
=            等于 2=3 False
<>, !=       不等于 2<>3 False
<=>          严格比较两个NULL值是否相等 NULL<=>NULL True
LIKE         简单模式匹配 "Guy Harrison" LIKE "Guy%" True
REGEXP       正则式匹配 "Guy Harrison" REGEXP "[Gg]reg" False
IS NULL      为空 0 IS NULL False
IS NOT NULL  不为空 0 IS NOT NULL True


    逻辑运算符

    与(AND)

XOR

TRUE

FALSE

NULL

TRUE

FALSE

TRUE

NULL

FALSE

TRUE

FALSE

NULL

NULL

NULL

NULL

NULL


    位运算符

     |   位或
    &   位与
    <<  左移位
    >>  右移位
    ~   位非(单目运算,按位取反)

   这里只是浅谈一下,具体的问题还要自己根据具体的情况去上网查资料处理,能力有限,望多包涵。

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值