MySQL 存储过程及游标使用

一、存储过程创建

1.1、语法
[DELIMITER $$ ]  --声明结束符号,mysql默认;为语句结束符,这里声明后当存储过程遇到$$才结束。
CREATE PROCEDURE pro_name ([[ IN |OUT | INOUT ] 参数名 数据类形...])  --pro_name过程名,in、out、inout为过程参数后面例子介绍
BEGIN
  --过程体
END
[$$]

1.2、创建user表数据如下

1.3、参数
1.3.1、IN参数  输入参数(可做查询条件):表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值

设置参数调用:

结果及解释:
a、定义userName='lisi'调用过程查出name为lisi的记录。

b、过程中通过set改变userName参数的值,查询为改变后的值。

c、过程解释再查询userName,结果为'lisi',及修改后变量值不会被返回。

1.3.2、OUT参数   输出参数,用于接受返回结果(无法在调用时指定,其值可在存储过程中改变,并将改变后的值返回。)

调用:

结果及解释:
a、定义值无法传入,第一条查询结果为null。

b、在过程中设值后,开始有值,且值可返回。

1.3.3、 INOUT参数  输入输出参数:调用时指定,并且可被改变和返回。(可做查询条件也可做结果返回)

调用:

结果及解释:
a、传入可直接接受

b、作为其他语句的条件直接使用

c、在过程中改变值,并返回到过程外


1.4 存储过程删除
语法: DROP PROCEDURE IF EXISTS pro_name;

二、存储过程使用游标
2.1 简单游标使用
例:定义如下存储过程

调用: CALL test_cursor();

name为lisi的记录已改为lisi1.


2.2 多游标及游标嵌套使用
例:定义的过程如下
DELIMITER $$
CREATE PROCEDURE test_cursor()
BEGIN 
	/*定义变量*/
	DECLARE userId Long;
	DECLARE userName VARCHAR(255);
	DECLARE userAge INT;
	-- 定义循环标识,默认值为 FALSE
	DECLARE done INT DEFAULT FALSE; 
	-- 定义游标
	DECLARE My_Cursor CURSOR FOR (SELECT id,`name`,age FROM user);
	DECLARE My_Cursor2 CURSOR FOR (SELECT id,`name`,age FROM user WHERE id in(3,4));
	DECLARE My_Cursor3 CURSOR FOR (SELECT id,`name`,age FROM user WHERE id=userId);
	-- 将结束标志绑定到游标,若没有数据返回,程序继续,并将变量done设为TRUE 
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
	-- 打开游标
	OPEN My_Cursor;
		myLoop : LOOP
			-- 循环游标中的数据,并赋值到变量中
			FETCH My_Cursor INTO userId,userName,userAge;
			IF done THEN
				LEAVE myLoop;
			ELSE
				IF userName='lisi' THEN
					UPDATE user SET `name`='lisi1' WHERE id=userId;
				END IF;
			END IF;
			COMMIT;
		END LOOP myLoop;
	CLOSE My_Cursor;

	-- 开始第二个游标时先将 done 置为 FALSE
	SET done = FALSE;
	
	-- 打开游标
	OPEN My_Cursor2;
		myLoop2 : LOOP
			-- 循环游标中的数据,并赋值到变量中
			FETCH My_Cursor2 INTO userId,userName,userAge;
			IF done THEN
				LEAVE myLoop2;
			ELSE
				OPEN My_Cursor3;
					myLoop3 : LOOP
						FETCH My_Cursor3 INTO userId,userName,userAge;
						IF done THEN
							LEAVE myLoop3;
						ELSE
							UPDATE user SET `name`=CONCAT(userName,'1','2') WHERE id=userId;
						END IF;
						COMMIT;
					END LOOP myLoop3;
				CLOSE My_Cursor3;
				-- 嵌套使用是内部游标结束后给done置 FALSE
				SET done=FALSE;
			END IF;
		END LOOP myLoop2;
	CLOSE My_Cursor2;
END
$$

调用后的结果:


  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值