粤嵌星计划打卡第91天(java中mysql数据库中的游标,与存储过程)

#粤嵌我来了##粤嵌星计划#
粤嵌星计划挑战
今天打卡第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);

运行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值