现在的位置: 首页 > 综合 > 正文

手把手教你mysql(十五)游标变量流程控制

2014年05月27日 ⁄ 综合 ⁄ 共 4066字 ⁄ 字号 评论关闭

手把手教你mysql(十五)游标变量流程控制

 

前言:

这是我准备的测试用数据

Mysql>DROP TABLE IF EXISTS `t_user`;

Mysql>CREATE TABLE t_user(

id INT PRIMARY KEY AUTO_INCREMENT,

username VARCHAR(20),

PASSWORD VARCHAR(20)

);

Mysql>DROP TABLE IF EXISTS `t_user`

Mysql>CREATE TABLE `t_user2`(

id2 INT PRIMARY KEY AUTO_INCREMENT,

username2 VARCHAR(20),

password2 VARCHAR(20)

);

Mysql>INSERT INTO `t_user2` VALUES (NULL,'aaa','1234');

 

一: 变量的使用

1.1     定义变量

DECLARE var_name [,...] type [ DEFAULT value ;

 

1.2     为变量赋值

语法1: SET var_name = expr [,var_name=expr] ... 通过Set来给变量赋值

例: mysql>DELIMITER $$

CREATE PROCEDURE pro_user()

BEGIN

DECLARE a,b VARCHAR(30);#定义变量a,b

SET a='Jon',b='123456';#给变量赋值

INSERT INTO t_user VALUES(NULL,a,b);

END;

$$ DELIMITER ; 




语法2: SELECT col_name[,...] INTO var_name[,...]

FROM table_name WHERE condition 通过SELECT语句来给变量赋值

 

Mysql>DELIMITER $$

CREATE PROCEDURE pro_user2()

BEGIN

DECLARE a,b VARCHAR(30);#定义变量a,b

SELECT username2,password2 INTO a,b FROM t_user2 WHERE id2=1;#通过Select语句为变量赋值

INSERT INTO t_user VALUES(NULL,a,b);

END;

$$ DELIMITER ;

 


二: 游标的使用

查询语句可能查询出多条记录,在存储过程和函数中使用游标来逐条读取查询结果集中的记录。游标的使用包括声明游标、打开游标、使用游标和关闭游标。游标必须声明在处理程序之前,并且声明在变量和条件之后。

2.1     声明游标

DECLARE cursor_name CURSOR FOR select_statement ;

 

2.2     打开游标

OPEN cursor_name;

 

2.3     使用游标

FETCH cursor_name INTO var_name [,var_name ... ];

 

2.4     关闭游标

CLOSE cursor_name;

例:通过使用游标将t_user2的数据全部插入到t_user表中(目前只有一条数据,等讲完循环,就能实现多条插入),

Mysql>UPDATE t_user2 SET username2='bbb',password2='123456';#更新记录,为了显示效果

Mysql>DELIMITER $$

CREATE PROCEDURE pro_user3()

BEGIN

DECLARE a,b VARCHAR(30);

DECLARE cur_t_user2 CURSOR FOR SELECT username2,password2 FROM t_user2;#在查询出的结果集中定义游标

OPEN cur_t_user2;#打开游标

FETCH cur_t_user2 INTO a,b;#使用游标,取出数据存入变量

INSERT INTO t_user VALUES(NULL,a,b);

CLOSE cur_t_user2;#别忘了关闭游标

END;

$$ DELIMITER ;



三: 流程控制的使用

存储过程和函数中可以使用流程控制来控制语句的执行。MySQL 中可以使用IF 语句、CASE 语句、LOOP语句、LEAVE 语句、ITERATE 语句、REPEAT 语句和WHILE 语句来进行流程控制。

3.1     IF 语句

IF search_condition THEN statement_list

[ ELSEIF search_condition THEN statement_list ]...

[ ELSE statement_list ]

END IF

例:创建名为pro_user4的存储过程,根据输入的id来判断记录是否存在然后做对应的操作.

mysql>DELIMITER $$

CREATE PROCEDURE pro_user4(IN userId INT)

BEGIN

SELECT COUNT(*) INTO @num FROM t_user WHERE id=userId; #@num是用户变量

IF @num>0 THEN #判断记录是否存在

UPDATE t_user SET username='oop' WHERE id=userId;

ELSE

INSERT INTO t_user VALUES(NULL,'oop','123456');

END IF;#别忘了End if;

END;

$$ DELIMITER ;

什么是用户变量?

你可以把它想象为全局变量

用户变量和局部变量的区别是什么?

用户变量可以作用于当前整个连接 Declare是定义局部变量 其作用域仅限于语句块,当语句块结束,变量就消失了。

大家可以看到,我这边输入的是4,因为记录不存在,@num=0,所以插入一条新数据。



3.2     CASE 语句

CASE case_value

WHEN when_value THEN statement_list

[WHEN when_value THEN statement_list]...

[ELSE statement_list ]

END CASE

 

例:创建一个存储过程,使用case来判断用户输入的值做不同的操作

Mysql>DELIMITER $$

CREATE PROCEDURE pro_user5(IN userId INT)

BEGIN

CASE userId

WHEN 1 THEN UPDATE t_user SET username='xxx' WHERE id=userId;

WHEN 2 THEN UPDATE t_user SET username='xxx' WHERE id=userId;

ELSE INSERT INTO t_user VALUES(NULL,'xxx','123456');

END CASE;#别忘了End Case

END;

$$ DELIMITER ;



3.3     LOOP,LEAVE 语句

LOOP 语句可以使某些特定的语句重复执行,实现一个简单的循环。但是LOOP 语句本身没有停止循环的语句,必须是遇到LEAVE 语句等才能停止循环。

LOOP 语句的语法的基本形式如下:

[begin_label:]LOOP

Statement_list

END LOOP [ end_label ];

LEAVE 语句主要用于跳出循环控制。语法形式如下:

LEAVE label

例:循环插入t_user表total条数据

Mysql>DELIMITER $$

CREATE PROCEDURE `pro_user6`(IN total INT)

BEGIN

aa:LOOP #aa为标签

IF total=0 THEN

LEAVE aa;

ELSE

INSERT INTO t_user VALUES(NULL,'ccc','111111');

END IF;

SET total=total-1;

END LOOP aa;

END;

$$ DELIMITER ;



3.4     ITERATE 语句

ITERATE 语句也是用来跳出循环的语句。但是,ITERATE 语句是跳出本次循环,然后直接进入下一次

循环。

基本语法:ITERATE label ;

 

Mysql>DELIMITER $$

CREATE PROCEDURE `pro_user7`(IN total INT)

BEGIN

aa:LOOP #aa为标签

SET total=total-1;

IF total = 0 THEN

LEAVE aa;

ELSEIF total>2 THEN

ITERATE aa; #当total大于2 跳出本次循环然后进入下一次

END IF;

INSERT INTO t_user VALUES(NULL,'eee','111111');

END LOOP aa;

END;

$$ DELIMITER ;



这边你们的id应该是11 12,我不小心多插了条记录,Sorry;

 

3.5     REPEAT 语句

REPEAT 语句是有条件控制的循环语句。当满足特定条件时,就会跳出循环语句。REPEAT 语句的基本

语法形式如下:

[ begin_label : ] REPEAT

Statement_list

UNTIL search_condition

END REPEAT [ end_label ];

Mysql>DELIMITER $$

CREATE PROCEDURE `pro_user8`(IN total INT)

BEGIN

REPEAT

SET total=total-1;

INSERT INTO t_user VALUES(NULL,'kkkkk','111111');

UNTIL total=2 #这边没有;

END REPEAT;

END;

$$ DELIMITER ;



3.6     WHILE 语句

[ begin_label : ] WHILE search_condition DO

Statement_list

END WHILE [ end_label ];

Mysql>DELIMITER $$

CREATE PROCEDURE `pro_user9`(IN total INT)

BEGIN

WHILE total>4 DO

INSERT INTO t_user VALUES(NULL,'pppp','111111');

SET total=total-1;

END WHILE;

END;

$$ DELIMITER ;



四: 总结

今天为大家带来了游标,变量,流程控制的知识,量比较大,大家好好消化一下,下节为大家带来数据备份与还原的知识,谢谢大家!

抱歉!评论已关闭.