1. 程式人生 > >mysql_01_遊標的使用

mysql_01_遊標的使用

一、表的建立

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 NULL
DEFAULT '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;