mysql中的游标和异常捕捉

# 第一个用 LOOP方式进行循环的游标测试代码

DROP PROCEDURE IF EXISTS cursor_test;

CREATE PROCEDURE cursor_test()
BEGIN
     DECLARE a INT;
     DECLARE v_done TINYINT DEFAULT FALSE;
     -- 声明游标,并表示游标从t1表中id字段获取数据
     DECLARE cur CURSOR FOR SELECT ID FROM t;
     -- 在此处后不能定义任何变量,否则sql会报错

     -- 捕捉查询不到的异常
     DECLARE CONTINUE handler FOR NOT found SET v_done=TRUE;

     DROP TABLE IF EXISTS t;
     CREATE TABLE t (ID INT,NAME VARCHAR(20));
     INSERT INTO t (ID) VALUES (1),(2),(3),(4),(5);

     OPEN cur;
     read_loop:LOOP
          FETCH cur INTO a;
          IF v_done THEN
               LEAVE read_loop;
          ELSE
               UPDATE  t SET t.NAME=CONCAT('aa',a)  WHERE t.ID = a;
          END IF;
     END LOOP;
END;



# 第二个用wile方式循环的游标测试代码
CREATE PROCEDURE myProException()
BEGIN
        DECLARE v_done INT DEFAULT 0;
        DECLARE v_index INT ;
        -- 声明游标,并表示游标从t1表中id字段获取数据
        DECLARE cur CURSOR FOR SELECT id FROM t1;
        -- 在此处后不能定义任何变量,否则sql会报错

        -- 捕捉查询不到的异常
        DECLARE CONTINUE HANDLER FOR NOT found SET v_done = 1;


        -- 创建表 12
        DROP TABLE IF EXISTS t1;
        CREATE TABLE t1 (id int);
        INSERT INTO t1 VALUES(1),(2),(3);

        OPEN cur;
        FETCH cur INTO v_index;
        WHILE v_done != 1
        DO
            SELECT v_index;
            FETCH cur INTO v_index;
        END WHILE;

        CLOSE cur;
END;

#第三个例子,用游标获取一行数据然后存入到新的表中

-- 游标取出多条数据进行更新
DROP PROCEDURE IF EXISTS cursores_test;
CREATE PROCEDURE cursores_test()
BEGIN
	-- 定义变量id
	DECLARE v_id INT;
	-- 定义变量用户名
	DECLARE v_name VARCHAR(20);
	-- 定义循环的标志
	DECLARE v_tag TINYINT DEFAULT FALSE;
	-- 定义循环的次数,此次数动态的从t_user表中获取数据长度
	DECLARE t_user_size INT;

	-- 定义游标
	DECLARE v_cursor CURSOR FOR SELECT id,name FROM t_user;
	-- 定义错误捕捉
	DECLARE CONTINUE HANDLER FOR NOT found SET t_user_size=0;
 
	-- 定义用户表
	DROP TABLE IF EXISTS t_user;
	CREATE TABLE t_user(id INT,name VARCHAR(20));
	INSERT INTO t_user (id,name) VALUES (5,'张三丰'),(61,'赵虎'),(72,'隔壁老王'),(28,'钱三'),(19,'李斯');

	-- 定义需要将用户表的信息转移到临时的表
	DROP TABLE IF EXISTS t_user_temp;
	CREATE TABLE t_user_temp(id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,u_id INT,u_name VARCHAR(20));

	-- 给循环的长度赋值
	SELECT COUNT(id) INTO t_user_size FROM t_user;
	-- 打开游标
	OPEN  v_cursor; /*接着使用OPEN打开游标*/
		-- 	把第一行数据写入变量中,游标也随之指向了记录的第一行
		FETCH  v_cursor INTO v_id, v_name;

		WHILE(t_user_size>0)
			DO
			-- 将游标读到的数据插入到新表t_user_temp
			insert INTO t_user_temp (u_id,u_name) values (v_id,v_name);
			-- 设置长度-1
			SET t_user_size = t_user_size-1; 
			-- 获取游标的下一条指引的数据
			FETCH v_cursor INTO v_id,v_name;
		END WHILE;
	-- 关闭游标
	CLOSE v_cursor;
END;



  • 注意事项:
    • 在游标定义后,如果再定义属性则SQL报错。譬如:在DECLARE cur CURSOR FOR SELECT id FROM t1 后定义 DECLARE v_i  INT ; 则SQL通不过
    • 游标必须在定义处理程序之前被定义,但变量必须在定义游标之前被定义,顺序就是变量定义-游标定义-处理程序。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值