手把手教你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 ;
四: 總結
今天爲大家帶來了遊標,變量,流程控制的知識,量比較大,大家好好消化一下,下節爲大家帶來數據備份與還原的知識,謝謝大家!