关闭

mysql学习笔记五----存储过程

标签: mysql
354人阅读 评论(0) 收藏 举报
分类:

存储过程(procedure)

是Mysql在标准的sql语言上的扩展. 存储过程不仅允许嵌入sql语言,还可以定义变量,允许使用条件语句和循环语句,这样使得它的功能变得更加强大。

1.创建

create procedure 过程名(参数1…) 

begin

   declare 变量名  类型;

   执行语句;

end$$

如:

(1)不带参数

delimiter $$   //修改语句结束标示符

        create procedure pro2() 

         begin 

             insert into users values(NULL,'test','123456',1);

        end$$

(2)带参数

create procedure pro5(myid int)

begin

select * from t1 where id=myid;

end$$

2.调用

call 过程名(传入参数..)

如: call pro2()$$

         call pro5(1)$$

或者在php中调用如下:

(1)$mysqli = new mysqli('127.0.0.1','root','123456','test');

if($mysqli->connect_error)

{

die('connect error('.$mysqli->connect_errno.')'.$mysqli->connect_error);

}

if(mysqli_connect_error())

{

die('connect error ('.mysqli_connect_errno().')'.mysqli_connect_error());

}

if($mysqli->query("call test.pro2()"))

{

echo "success<br/>";

}

else

{

echo "falied<br/>";

}

(2)$con=mysql_connect("localhost","root","root");

if(!$con){

die('error');

}

 

mysql_select_db("test");

 

if($res=mysql_query("call test.pro5(1)")){

while($row=mysql_fetch_assoc($res)){

echo "<pre>";

print_r($row);

echo "</pre>";

}

}

3.存储过程-参数in out inout

过程用于执行特定的操作.当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out). 或者(inout) ,默认是in

create procedure 过程名(in 变量 变量类型…, out 变量 变量类型,

out 变量 变量类型) 

begin

执行语句; 

end;

例子:

create procedure pro6(in myid int,out myname varchar(255)) 

begin 

select name into myname from test where id=myid; 

end$$

调用:call pro6(2,@myname)$$

             select @myname$$

4.光标(游标) cursor

定义游标:

DECLARE 光标名 CURSOR FOR select 语句;

打开游标: 

open 光标名;

取出当前游标指向的行.

fetch 光标名 into 其它变量;

判断游标是否指向记录最后,游标一般是循环的取出,因此,通常在repeate语句中使用.(通常的结构如下代码)

语法结构如下:

create procedure 过程名()

begin

#这里很重要设置一个标志符

DECLARE done INT DEFAULT 0;

DECLARE cur1 CURSOR FOR sql语句;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

open cur1;

#遍历光标

REPEAT

fetch cur1 into 变量;

IF NOT done THEN

//do something

end if; 

UNTIL done END REPEAT;

close cur1;

end$$

示例:

create procedure pro9(in indeptno int)

begin

#这里很重要设置一个标志符

DECLARE done INT DEFAULT 0;

declare oldsal decimal;

declare myempno int;

DECLARE cur1 CURSOR FOR SELECT sal,empno FROM emp where deptno=indeptno;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

open cur1;

#遍历光标

REPEAT

fetch cur1 into oldsal,myempno;

IF NOT done THEN

if oldsal<200 then

update emp set sal=sal+100 where empno=myempno;

end if;

end if; 

UNTIL done END REPEAT;

close cur1;

end$$

--控制台调用

call pro9(10)$$

--php程序调用

$con=mysql_connect("localhost","root","root");

if(!$con){

die('error');

}

 

mysql_select_db("test");

 

if(mysql_query("call test.pro9(10)")){

echo "up ok";

}

 

5.变量SET语句

在存储过程中,我们可以通过set语句来给某个变量赋值。

示例:

create procedure pro0()

begin

declare aa int;

set aa=120;

select aa;

end$$

6.控制结构-条件

(1)IF search_condition THEN statement_list

    //do something

END IF

(2)IF search_condition THEN statement_list

//do something     

ELSE statement_list

//do something

END IF

(3)IF search_condition THEN statement_list

    ELSEIF search_condition THEN statement_list ...

    ELSE statement_list

END IF

示例:

create procedure pro11(in myname varchar(255)) begin declare mysal int; select sal into mysal from emp where empName=myname; if mysal < 5000 then update emp set sal=sal+sal*0.1 where empName=myname;end if; end$$

 7.控制结构--循环语句

(1)loop 
执行语句…;
end loop

示例

create procedure pro12(in userName varchar(255),in maxId int) begin declare var1 int default 0; label1:loop set var1 = var1 +1; if var1 < maxId then insert into aaa values(var1,userName); iterate label1;end if; leave label1;end loop label1; end$$

(2)WHILE search_condition DO    
statement_list
END WHILE 

示例:

--创建表
create table users(id int primary key , name varchar(32));
--存储过程
create procedure pro13(in name varchar(32))
begin
declare mynum int default 0;
declare startno int default 11;
while mynum<10 do
insert into users values(startno,name);
set mynum=mynum+1;
set startno=startno+1;
end while;
end$$
--调用
call pro13('abc')$$

(3)REPEAT    
statement_list
UNTIL search_condition
END REPEAT

示例:

--存储过程
create procedure pro14(in name varchar(32))
begin
declare mynum int default 0;
declare startno int default 21;
repeat 
insert into users values(startno,name);
set mynum=mynum+1;
set startno=startno+1;
until mynum>9 end repeat;
end$$


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:32948次
    • 积分:835
    • 等级:
    • 排名:千里之外
    • 原创:51篇
    • 转载:5篇
    • 译文:0篇
    • 评论:1条