一、表的创建
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;
原文地址:https://www.cnblogs.com/ouyy/p/10175591.html
时间: 2024-11-02 15:48:18