MySQL游标多循环一次的问题怎么解决

45次阅读
没有评论

共计 2897 个字符,预计需要花费 8 分钟才能阅读完成。

这篇文章主要讲解了“MySQL 游标多循环一次的问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“MySQL 游标多循环一次的问题怎么解决”吧!

在 MySQL 中使用游标的时候,发现游标多循环一次
想在表中插入一条语句,但是实际上却插入了两条
语句如下:
mysql create table test(id int(5));
Query OK, 0 rows affected (0.13 sec)

mysql delimiter $$
mysql create procedure proc_drop_table()
  – BEGIN
  – /* Declare Variables */
  – DECLARE done_1 INT DEFAULT FALSE;
  – DECLARE v_history_table_name varchar(64);
  – declare the_query VARCHAR(500);
  –
  – /* Declare Conditions */
  – DECLARE not_found CONDITION FOR 1741;
  –
  – /* Declare Cursors */
  – DECLARE cur1 CURSOR FOR select CONCAT(TABLE_SCHEMA, . ,TABLE_NAME) from  information_schema.tables where TABLE_SCHEMA= test and TABLE_NAME like %test%
  –
  – /* Declare Exception Handlers, usually with set actions */
  – /* usually with set actions, the following handler has two forms,
  /*   one with begin .. end statements, and the other without */
  – DECLARE CONTINUE HANDLER FOR NOT FOUND SET done_1 = TRUE;
  –
  –   OPEN cur1;
  –   read_loop_1: LOOP
  –   FETCH cur1 INTO v_history_table_name;
  – /*IF done_1 IS FALSE THEN*/
  – set @v_history_table_name=v_history_table_name;
  –   select concat(insert into , @v_history_table_name, values (10) ) into the_query;
  – SET @stmt=the_query;
  – PREPARE STMT FROM @stmt;
  – EXECUTE STMT;
  – DEALLOCATE PREPARE STMT;
  – /*END IF;*/
  –   IF done_1 THEN
  –   LEAVE read_loop_1;
  – END IF;
  – END LOOP read_loop_1;
  – CLOSE cur1;
  –   end$$
Query OK, 0 rows affected (0.01 sec)

mysql delimiter ;
mysql select * from test;
Empty set (0.00 sec)

mysql call proc_drop_table();
Query OK, 0 rows affected (0.01 sec)

mysql select * from test;
+——+
| id  |
+——+
|  10 |
|  10 |
+——+
2 rows in set (0.00 sec)

解决方法:
在实际执行的语句两边增加 IF 判断

mysql truncate table test;
Query OK, 0 rows affected (0.07 sec)

mysql drop procedure proc_drop_table;
Query OK, 0 rows affected (0.09 sec)

mysql delimiter $$
mysql create procedure proc_drop_table()
  – BEGIN
  – /* Declare Variables */
  – DECLARE done_1 INT DEFAULT FALSE;
  – DECLARE v_history_table_name varchar(64);
  – declare the_query VARCHAR(500);
  –
  – /* Declare Conditions */
  – DECLARE not_found CONDITION FOR 1741;
  –
  – /* Declare Cursors */
  – DECLARE cur1 CURSOR FOR select CONCAT(TABLE_SCHEMA, . ,TABLE_NAME) from  information_schema.tables where TABLE_SCHEMA= test and TABLE_NAME like %test%
  –
  – /* Declare Exception Handlers, usually with set actions */
  – /* usually with set actions, the following handler has two forms,
  /*   one with begin .. end statements, and the other without */
  – DECLARE CONTINUE HANDLER FOR NOT FOUND SET done_1 = TRUE;
  –
  –   OPEN cur1;
  –   read_loop_1: LOOP
  –   FETCH cur1 INTO v_history_table_name;
  – IF done_1 IS FALSE THEN
  – set @v_history_table_name=v_history_table_name;
  –   select concat(insert into , @v_history_table_name, values (10) ) into the_query;
  – SET @stmt=the_query;
  – PREPARE STMT FROM @stmt;
  – EXECUTE STMT;
  – DEALLOCATE PREPARE STMT;
  – END IF;
  –   IF done_1 THEN
  –   LEAVE read_loop_1;
  – END IF;
  – END LOOP read_loop_1;
  – CLOSE cur1;
  –   end$$
Query OK, 0 rows affected (0.00 sec)

mysql delimiter ;
mysql call proc_drop_table();
Query OK, 0 rows affected (0.01 sec)

mysql select * from test;
+——+
| id  |
+——+
|  10 |
+——+
1 row in set (0.00 sec)

感谢各位的阅读,以上就是“MySQL 游标多循环一次的问题怎么解决”的内容了,经过本文的学习后,相信大家对 MySQL 游标多循环一次的问题怎么解决这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-01发表,共计2897字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)