首先说一下为什么要使用存储过程,存储过程是在数据库中预编译的程序代码,其执行效率显然要比从程序端传过去的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<=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
位运算符
| 位或
& 位与
<
>> 右移位
~ 位非(单目运算,按位取反)
这里只是浅谈一下,具体的问题还要自己根据具体的情况去上网查资料处理,能力有限,望多包涵。