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;

 

猜你喜欢

转载自www.cnblogs.com/ouyy/p/10175591.html