首先说一下为什么要使用存储过程,存储过程是在数据库中预编译的程序代码,其执行效率显然要比从程序端传过去的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 ;

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

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

declare beginNum int default 0;但是变量要先声明后赋值如 set beginNum = (pageIndex - 1) * pageLength;

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



    位运算符



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


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