mysql_01_遊標的使用
阿新 • • 發佈:2018-12-25
一、表的建立
DROP TABLE IF EXISTS shops_info; /*EMP產品版本版本資訊表*/ CREATE TABLE shops_info ( ID INT PRIMARY KEY NOT NULL AUTO_INCREMENT, /*自增ID*/ name VARCHAR(20) DEFAULT '' NOT NULL, price INT DEFAULT 0 NOT NULL, pdesc VARCHAR(20) DEFAULT '0' NOT NULL, CREATETIME DATETIME NOT NULLDEFAULT '0000-00-00 00:00:00', /*建立時間*/ MEMO VARCHAR(128) DEFAULT '' NOT NULL /*備註*/ ) ENGINE=INNODB DEFAULT CHARSET=UTF8;
二、插入資料
-- 插入資料 insert into shops_info(name,price,pdesc) SELECT '電飯煲',400,'煮飯' FROM DUAL WHERE NOT EXISTS(SELECT * FROM shops_info WHERE name='電飯煲');
三、遊標的使用
1、遊標的使用步驟
遊標的使用一般分為5個步驟,主要是:定義遊標->開啟遊標->使用遊標->關閉遊標->釋放遊標。
-- (1).定義遊標 DECLARE <遊標名> CURSOR FOR select語句; -- (2).開啟遊標 open <遊標名> -- (3).使用遊標 -- 使用遊標需要用關鍵字fetch來取出資料,然後取出的資料需要有存放的地方,我們需要用declare宣告變數存放列的資料其語法格式為: -- declare 變數1 資料型別(與列值的資料型別相同) -- declare 變數2 資料型別(與列值的資料型別相同) -- declare 變數3 資料型別(與列值的資料型別相同)-- FETCH [NEXT | PRIOR | FIRST | LAST] FROM <遊標名> [ INTO 變數名1,變數名2,變數名3[,…] ] -- NEXT:取下一行的資料,遊標一開始預設的第一行之前,故要讓遊標指向第一行,就必須第一次就執行FETCH NEXT操作 -- INTO:將一行中每個對應的列下的資料放到與列 的資料型別相同的變數中。 -- (4).關閉遊標: close mycursor; -- (5).釋放遊標 deallocate mycursor;
2、遊標的具體使用
-- 1、未使用迴圈的遊標例項
-- 從表shops_info中使用遊標對每一行進行fetch
-- 注意:儲存過程申明的變數名稱不能和資料庫中欄位名稱一樣,否則取不到值
DELIMITER $$ drop PROCEDURE if EXISTS cursor_test; create PROCEDURE cursor_test() BEGIN DECLARE id1 INT; DECLARE name1 VARCHAR(20); DECLARE price1 INT; DECLARE pdesc1 VARCHAR(20); -- 定義遊標 DECLARE mycursor CURSOR for select id,name,price,pdesc from shops_info; -- 開啟遊標 open mycursor; -- 使用遊標 FETCH next from mycursor into id1,name1,price1,pdesc1; -- 顯示結果 select id1,name1,price1,pdesc1; -- 關閉遊標 close mycursor; END $$ DELIMITER ; -- 儲存過程的呼叫 CALL cursor_test(); DROP PROCEDURE IF EXISTS cursor_test;
-- 2、使用迴圈的遊標例項
DELIMITER $$ drop PROCEDURE if EXISTS cursor_test; create PROCEDURE cursor_test() BEGIN DECLARE tmpName VARCHAR(20) default '' ; DECLARE allName varchar(255) default ''; -- 定義遊標 DECLARE mycursor CURSOR for select name from shops_info; -- MySQL遊標異常後捕捉,並設定迴圈使用變數 tmpname 為 null 跳出迴圈 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET tmpName = null; -- 開啟遊標 open mycursor; -- 使用遊標 FETCH mycursor into tmpName; while (tmpName is not null) do set tmpName = CONCAT(tmpName ,";") ; set allName = CONCAT(allName ,tmpName) ; FETCH mycursor into tmpName; END WHILE; -- 顯示結果 select allName; -- 關閉遊標 close mycursor; END $$ DELIMITER ; -- 儲存過程的呼叫 CALL cursor_test(); DROP PROCEDURE IF EXISTS cursor_test;