多语言展示
当前在线:333今日阅读:31今日分享:25

MySQL存储过程与函数篇,使用光标(游标)

查询语句可能返回多条记录,在存储过程或函数中使用光标来逐条读取查询结果集中的记录。
工具/原料
1

电脑

2

MySQL

3

Navicat等MySQL可视化管理工具

语法结构
1

1.语句结构声明光标:DECLARE 光标名称 CURSOR FOR 查询语句打开光标:OPEN 光标名称使用光标:FETCH 光标名称 INTO 参数名称1,参数名称2....(参数名称必须已定义)关闭光标CLOSE 光标名称

创建测试用表及测试数据
1

1.创建数据库CREATE TABLE `test_10` (  `id` int(11) NOT NULL AUTO_INCREMENT,   #id  `name` varchar(50) DEFAULT NULL,   #名称  `age` int(11) DEFAULT NULL,   #年龄  PRIMARY KEY (`id`)   #主键) ENGINE=MyISAM AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4;

2

2.插入测试数据INSERT INTO `test_10` VALUES ('1', 'rat', '2');INSERT INTO `test_10` VALUES ('2', 'ox', '4');INSERT INTO `test_10` VALUES ('3', 'tiger', '6');INSERT INTO `test_10` VALUES ('4', 'rabbit', '8');INSERT INTO `test_10` VALUES ('5', 'dragon', '10');INSERT INTO `test_10` VALUES ('6', 'snake', '12');INSERT INTO `test_10` VALUES ('7', 'horse', '14');INSERT INTO `test_10` VALUES ('8', 'sheep', '16');INSERT INTO `test_10` VALUES ('9', 'monkey', '18');INSERT INTO `test_10` VALUES ('10', 'chicken', '20');INSERT INTO `test_10` VALUES ('11', 'dog', '22');INSERT INTO `test_10` VALUES ('12', 'pig', '24');INSERT INTO `test_10` VALUES ('13', 'cat', '26');

测试用例
1

题目:存储过程中使用光标,把age<=10的数据age-1,age>10的数据age-2CREATE PROCEDURE test_cursor ()#定义存储过程BEGIN #开始DECLARE animal_id INT (11);#定义变量参数DECLARE animal_age INT (11);#定义变量参数DECLARE cur CURSOR FOR SELECT id,age FROM test_10;#定义光标,注意CURSOROPEN cur;#打开游标    read_loop:LOOP#循环语句        FETCH cur INTO animal_id,animal_age;#使用游标赋值到变量                IF animal_age > 10 THEN #如果age>10 age-2            UPDATE test_10 SET age = animal_age - 2 WHERE id = animal_id;        ELSE #否则age-1            UPDATE test_10 SET age = animal_age - 1 WHERE id = animal_id;        END IF;        IF animal_id = 13 THEN #如果是最大的13 跳出循环            LEAVE read_loop;        END IF; #结束条件语句    END LOOP read_loop; #结束循环语句CLOSE cur;

2

调用一下刚刚定义的存储过程call test_cursor;可以看到完全实现了示例的效果

注意事项
1

声明光标的CURSOR 是关键字,注意不要省略

2

每个代码块记住要加上分号;

推荐信息