手把手教你mysql(十五)遊標變量流程控制

手把手教你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 ;




四: 總結

今天爲大家帶來了遊標,變量,流程控制的知識,量比較大,大家好好消化一下,下節爲大家帶來數據備份與還原的知識,謝謝大家!


發佈了37 篇原創文章 · 獲贊 6 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章