首先说一下为什么要使用存储过程,存储过程是在数据库中预编译的程序代码,其执行效率显然要比从程序端传过去的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>2False
<= 小于等于2<=2True
>= 大于等于3>=2True
BETWEEN 在两值之间5 BETWEEN 1 AND 10True
NOT BETWEEN 不在两值之间5 NOT BETWEEN 1 AND 10False
IN 在集合中5 IN (1,2,3,4)False
NOT IN 不在集合中5 NOT IN (1,2,3,4)True
=等于2=3False
<>, != 不等于2<>3False
<=> 严格比较两个NULL值是否相等NULL<=>NULLTrue
LIKE简单模式匹配"Guy Harrison" LIKE "Guy%"True
REGEXP 正则式匹配"Guy Harrison" REGEXP "[Gg]reg"False
IS NULL 为空0 IS NULLFalse
IS NOT NULL 不为空0 IS NOT NULLTrue
逻辑运算符
与(AND)
XOR
TRUE
FALSE
NULL
TRUE
FALSE
TRUE
NULL
FALSE
TRUE
FALSE
NULL
NULL
NULL
NULL
NULL
位运算符
| 位或
& 位与
<
>> 右移位
~ 位非(单目运算,按位取反)
这里只是浅谈一下,具体的问题还要自己根据具体的情况去上网查资料处理,能力有限,望多包涵。