#粤嵌我来了##粤嵌星计划#
粤嵌星计划挑战
今天打卡第91天
1.游标的介绍
mysql中的cursor是一个重要的概念, 有数据缓冲的思想,;用来存放sql语句的执行的结果。
先有数据基础:游标是在先从数据表中检索出数据之后才能继续灵活的操作技术
类似于**指针;**用来pop出所指向的数据,并只能每次取一个。
*
2.游标的优缺点:
(1)游标的优点
因为游标是针对行进行操作的,所以对于数据库中select语句的查询得到的每一行可以进行分开你独立的或者不同的操作
是一种分离的思想。可以满足对于某个结果的特殊操作。
游标与基于游标位置的增删查改能力。
mysql数据库中没有专门描述一行的表达形式,但这是需要的,所以(游标就是在关系数据库中这种面向集合的系统中抽出来,按住针对于行进行表达)
游标就是面向集合与面向行之间设计思想之间的一种桥梁
(2)游标的缺点
只能一行一行的进行操作**,不适用数据量较大的情况,速度过慢**
一个简单的例子
当你去ATM存钱是希望一次性存完呢,还是100一张一张的存,这里的100一张一张存就是游标针对行的操作。 数据库大部分是面对集合的,业务会比较复杂,而游标使用会有死锁,影响其他的业务操作,不可取。 当数据量大时,使用游标会造成内存不足现象。
3.游标的使用场景
1.游标的使用步骤一共有5步:主要是:定义游标->打开游标->使用游标->关闭游标 ->释放游标。
(1)定义游标
DECLARE <游标名> CURSOR FOR select语句;
具体例子
-- 这样游标就对select语句声明了一个游标
DECLARE mycursor CURSOR FOR select * from shops_info;
2什么是存储过程
(1)可以理解为sql语句集,可以同时调用多条sql,实现比较复杂的逻辑
2.1 存储过程的特性
有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能;
函数的普遍特性:模块化,封装,代码复用;
速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤;
2.2创建一个简单的存储过程
存储过程proc_adder功能简单,两个整形输入参数a 和 b,一个整形输出参数sum,功能就是计算输出参数的结果,赋值给输出参数sum;
几点说明:
DELIMITER;;:就是把默认的输入结束符;替换成;;。
DEFINER:创建者;
-- ----------------------------
-- Procedure structure for `proc_adder`
-- ----------------------------
DROP PROCEDURE IF EXISTS `proc_adder`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_adder`(IN a int, IN b int, OUT sum int)
BEGIN
#Routine body goes here...
DECLARE c int;
if a is null then set a = 0;
end if;
if b is null then set b = 0;
end if;
set sum = a + b;
END
;;
DELIMITER ;
执行以上存储结果,验证是否正确;
DELIMITER ;
set @b=5;
call proc_adder(2,@b,@s);
select @s as sum;
运行结果
存储过程中的控制语句
if语句
DROP PROCEDURE IF EXISTS `proc_if`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_if`(IN type int)
BEGIN
#Routine body goes here...
DECLARE c varchar(500);
IF type = 0 THEN
set c = 'param is 0';
ELSEIF type = 1 THEN
set c = 'param is 1';
ELSE
set c = 'param is others, not 0 or 1';
END IF;
select c;
END
;;
DELIMITER ;
CASE语句:
-- ----------------------------
-- Procedure structure for `proc_case`
-- ----------------------------
DROP PROCEDURE IF EXISTS `proc_case`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_case`(IN type int)
BEGIN
#Routine body goes here...
DECLARE c varchar(500);
CASE type
WHEN 0 THEN
set c = 'param is 0';
WHEN 1 THEN
set c = 'param is 1';
ELSE
set c = 'param is others, not 0 or 1';
END CASE;
select c;
END
;;
DELIMITER ;
set @type = 1;
call proc_case(@type);
运行结果
循环while语句
DROP PROCEDURE IF EXISTS `proc_while`;
DELIMITER ;;
CREATE DEFINER =`root`@`localhost` PROCEDURE `proc_while`(IN N int)
BEGIN
DECLARE i int;
DECLARE s int;
set i = 0;
set s = 0;
while i <=n Do
set s = s+i;
set i = i+1;
END WHILE;
SELECT s ;
END
;;
DELIMITER ;
set @type = 100;
call proc_while(@type);
运行结果