分类: Mysql/postgreSQL
2011-07-20 10:59:41
存储过程是MySQL5中最大创新,他们是由MySQL服务器直接存储和执行的SQL语句。
好处: 更快的速度、避免代码冗余、提高数据库的安全性、存储过程分为过程与函数
函数
有返回值
嵌套在SQL命令中使用
过程
没返回值
通过call调用
可以传引用参数
更多的SQL命令
声明变量
declare var1,var2,…datatype [default value]; 如:declare max int ;
变量赋值
set var1=value1,var2=value2;
select value1,value2,… into var1,var2,…
select col from tbl where into var1
存储过的语法
create procedure prodedurename(var datatype,...)
begin
//sql语句
end;
示例:
mysql> create procedure pro1(x int,y int)
-> begin
-> select (x+y);
-> end
调用 call pro1(2,3);
示例:
create procedure pro3(vid int)
-> begin
-> declare sname varchar(20);
-> select name into sname from person where id=vid;
-> select sname;
-> end
示例:
create procedure pro4(vid int)
begin
declare sname varchar(10);
declare vcid int;
select name,*** into sname,vcid from person where id=vid;
select sname;
select vcid;
end
create procedure pro7(vid int)
-> begin
-> declare sname varchar(20);
-> select name from person where id=vid into sname;
-> select sname;
-> end
存储过程参数三种模
1.in 输入
2.out 输出
3.in out 输入 输出
create procedure pro5(in x int,out y int,inout z int)
begin
select x,y,z;
set x=10;
set y=20;
set z=30;
select x,y,z;
end$$
create procedure pro6()
-> begin
-> declare s1 int;
-> declare s2 int;
-> declare s3 int;
-> set s1=1;
-> set s2=2;
-> set s3=3;
-> call pro5(s1,s2,s3);
-> select s1,s2,s3;
-> end$$
逻辑语句结构
选择
if 条件 then
语句;
[else if 条件 then
语句;]
[else
语句;]
end if ;
求最大值函数示例-:
create function mymax(x int ,y int)
returns int NO SQL
begin
declare max int ;
set max = x;
if y >max then
set max = y;
end if;
return max;
end
求最大值函数示例2:
create procedure getmax(x int,y int)
-> begin
-> if x>y then
-> select x;
-> else
-> select y;
-> end if;
-> end$$
循环
loopname:loop
语句;
end loop loopname
求一至一百的和:
create procedure pro8()
-> begin
-> declare sum,i int default 0;
-> sumloop:loop
-> set sum=sum+i;
-> if i>=100 then
-> leave sumloop;
-> end if;
-> set i=i+1;
-> end loop sumloop;
-> select sum;
-> end$$
loop循环实例:
create function mypow(x int ,y int)
returns int NO SQL
begin
declare temp,ret int default 1;
myloop:loop
set ret = ret * x;
if temp=y then
leave myloop;
end if;
set temp =temp + 1;
end loop myloop;
return ret;
end