当前位置:Gxlcms > 数据库问题 > mysql_01_游标的使用

mysql_01_游标的使用

时间:2021-07-01 10:21:17 帮助过:4人阅读

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;

 

 

mysql_01_游标的使用

标签:table   weight   数据库   异常   declare   打开   ble   where   etc   

人气教程排行