`

MySQL嵌套游标循环、动态游标

 
阅读更多

表结构:

 

表数据:


 

期望结果:


 虽然这种结果可以通过MySQL中的GROUP_CONCAT函数实现,但是此函数有字节长度限制

SELECT ROW_ID, CAST(CONCAT('[', GROUP_CONCAT('{\'FIELD_ID\'', ' : ', IF(INSTR(VALUE, '[{') = 0, CONCAT('\'', VALUE, '\''), VALUE), '}'), ']') AS BINARY) FROM T_TASK_DATA GROUP BY ROW_ID

 

 

 

DELIMITER $$
USE `mpp_master_data`$$
DROP PROCEDURE IF EXISTS `SP_QUERY_TASK_DATA`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `SP_QUERY_TASK_DATA`()
BEGIN
	DECLARE V_FIG INT DEFAULT 0;
	DECLARE V_ROW_ID INT;
	DECLARE V_FIELD_ID INT;
	DECLARE V_FIELD_VALUE VARCHAR(10240);
	
 	DECLARE V_CRS_TASK_DATA CURSOR FOR SELECT DISTINCT ROW_ID AS V_ROW_ID FROM T_TASK_DATA LIMIT 0, 200;
 	DECLARE V_CRS_FIELD_DATA CURSOR FOR SELECT FIELD_ID AS V_FIELD_ID, VALUE AS V_FIELD_VALUE FROM T_TASK_DATA WHERE ROW_ID=V_ROW_ID ORDER BY FIELD_ID ASC;
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET V_FIG = 1;
	
	-- 创建临时表
	DROP TABLE IF EXISTS TMP_TASK_ROW_DATA;
	CREATE TEMPORARY TABLE TMP_TASK_ROW_DATA(ROW_ID INT(10), VALUE VARCHAR(10240), PRIMARY KEY (`ROW_ID`));
	
	-- 打开第一层游标,进行遍历
	OPEN V_CRS_TASK_DATA;
	ROW_LOOP: LOOP
	  FETCH V_CRS_TASK_DATA INTO V_ROW_ID;
	  IF V_FIG = 1 THEN
	    LEAVE ROW_LOOP;
	  END IF;
	  
	  SET @V_VALUE = '';
	  
	  -- 打开第二层游标,进程遍历
	  OPEN V_CRS_FIELD_DATA;
	  FIELD_LOOP: LOOP
	    FETCH V_CRS_FIELD_DATA INTO V_FIELD_ID, V_FIELD_VALUE;
	    IF V_FIG = 1 THEN
	      LEAVE FIELD_LOOP;
	    END IF;
	    
	    SET @V_VALUE = CONCAT(@V_VALUE, CONCAT(',{"FIELD_ID": ', V_FIELD_ID, ', "VALUE": "', IFNULL(V_FIELD_VALUE, '') ,'"}'));
	  END LOOP FIELD_LOOP;
	  CLOSE V_CRS_FIELD_DATA;
	  SET V_FIG = 0;
	  
	  SET @V_VALUE = SUBSTRING(@V_VALUE, 2);
	  SET @V_VALUE = REPLACE(@V_VALUE, '"', '#');
	  SET @V_VALUE = REPLACE(@V_VALUE, '\'', '$');
	  
	  SET @V_SQL = CONCAT('INSERT INTO TMP_TASK_ROW_DATA(ROW_ID, VALUE) VALUES (', V_ROW_ID, ', \'[', @V_VALUE, ']\');');
	  -- SELECT V_ROW_ID, @V_VALUE, @V_SQL; 
	  
	  PREPARE MAIN_STMT FROM @V_SQL;
	  EXECUTE MAIN_STMT;
	  DEALLOCATE PREPARE MAIN_STMT;
	  
	END LOOP ROW_LOOP;
	CLOSE V_CRS_TASK_DATA;  
	
	SELECT * FROM TMP_TASK_ROW_DATA;
	DROP TABLE TMP_TASK_ROW_DATA;
  END$$
DELIMITER ;

 

 

 

以上第二个游标属于模拟动态,

第二种方式:

MySQL本身是不支持动态游标的,但可以通过(准备语句+视图+静态游标)的方法来近似实现。 

参考:

http://suwish.com/html/mysql-dynamic-cursor.html

http://blog.csdn.net/wzy0623/article/details/8619253

 

说明:

http://blog.csdn.net/zengmuansha/article/details/5516924

 

游标循环 查询和更新是很慢的一件事情  

第一层层循环200  

第二层循环最大15  

执行拼接的SQL插入数据到临时表

 

总共耗时21秒左右,两层循环耗时16秒左右  

  • 大小: 18.1 KB
  • 大小: 115.7 KB
  • 大小: 150.3 KB
分享到:
评论

相关推荐

    Mysql存储过程循环内嵌套使用游标示例代码

    总结来说,这个示例展示了如何在MySQL存储过程中使用游标进行循环处理,并在循环内部再次嵌套游标以实现更精细的数据操作。这种技术在处理大量数据或执行复杂逻辑时非常有用,尤其是在需要逐行检查和处理数据的情况...

    mysql游标嵌套[文].pdf

    MySQL 游标嵌套实践 本文档旨在介绍 MySQL 游标嵌套的概念和实践,通过对游标的嵌套使用,演示如何实现复杂的数据操作。 一、游标嵌套简介 游标(Cursor)是数据库中的一种控制结构,可以用来遍历查询结果集。...

    mysql游标

    除了基础的游标操作,MySQL还支持其他特性,如:嵌套游标(一个游标内部使用另一个游标)、可滚动游标(允许向前和向后移动)以及隐式游标(无需显式声明,常在存储过程中使用)。 在实际应用中,游标常常用于以下...

    mysql游标详解

    如果需要实现嵌套的游标循环,可以使用 BEGIN 和 END 语句来划分一个statement block,例如: DECLARE fetchSeqOk BOOLEAN; BEGIN DECLARE _seqname VARCHAR(50); DECLARE _value BIGINT(20); DECLARE ...

    Mysql的游标的定义使用及关闭深入分析

    下面是一个包含嵌套游标循环的示例: ```sql begin -- 嵌套循环的变量和游标定义 ... inner_loop: begin -- 内部游标定义 declare innerCursor cursor for ... -- 内部游标错误处理器 declare continue ...

    mysql 多个游标依次执行

    mysql存储过程 多个游标循环(依次执行,非嵌套循环)REPEAT循环。有需要的可自行下载。

    mysql存储过程双层嵌套

    loop 游标双层嵌套循环 创建临时表, 游标

    MySQL嵌套事务所遇到的问题

    MySQL数据库支持嵌套事务,然而在实际应用中并不常见,因为它们可能会引发一些意料之外的问题。嵌套事务通常指的是在一个事务内部启动另一个事务,这种用法在某些特定情况下可能是必要的,但大多数时候应避免使用。 ...

    mysql 面试题.zip

    - 游标的概念和使用:学习如何在循环中逐行处理查询结果,提供更灵活的数据处理能力。 9. **50道myaql不全 不保证准确性.txt** 和 **MySql第二章练习.txt** - 这些可能是面试题目或练习题,涵盖前面提到的各种...

    MySQL必知必会_dotzgx_MYSQL_

    7. **游标**:游标允许在结果集中逐行处理数据,特别是在需要循环遍历结果集时,游标非常实用。理解如何声明、打开、读取和关闭游标,以及在存储过程中如何使用它们。 8. **触发器**:触发器是数据库自动执行的预定...

    dbmove_sql语句转化.zip_MYSQL_dbmove_oracle

    Oracle中的游标和FOR循环在MySQL中通常需要用DECLARE、OPEN、FETCH和CLOSE等语句来实现,或者直接用嵌套的SELECT语句。 6. **连接与子查询**: Oracle的CONNECT BY用于构建层次查询,而在MySQL中可能需要递归的...

    MySQL性能优化中文手册

    优化存储过程时,应尽量减少嵌套循环和复杂的逻辑判断,使用适当的变量和游标来控制流程。同时,注意参数化查询可以防止SQL注入并提高执行效率。 函数优化通常涉及内置函数的使用和自定义函数的编写。内置函数已经...

    MySQL存储过程例子(包含事务,输出参数,嵌套调用)

    MySQL存储过程是一种预编译的SQL代码集合,可以在需要...总结来说,这个例子展示了如何在MySQL中创建和使用存储过程,包括事务控制、参数传递、嵌套调用和游标的使用,是学习和理解MySQL存储过程功能的一个很好的实例。

    pymysql 操作MySQL数据库

    pymysql 操作MySQL数据库 pymysql 是 Python 中一个流行的 MySQL 客户端库,...pymysql 操作 MySQL 数据库需要注意链接数据库、游标 Cursor、查询操作、插入操作、关闭连接、变量传值、SQL 语句拼接和事务提交等问题。

    mysql命令大全

    - 特点: 结合了静态和动态游标的特性,可以通过键集来定位行。 ### 3. 数据库中的连接类型 - **内连接 (INNER JOIN)**: - 说明: 返回两个表中满足连接条件的所有记录。 - **外连接 (OUTER JOIN)**: - **左外连接...

    mysql manual include ansi sql

    8. **子查询优化**:MySQL对嵌套查询进行了优化,支持子查询嵌套在FROM子句、WHERE子句和HAVING子句中,以满足ANSI SQL的要求。 9. **窗口函数(Window Functions)**:MySQL 8.0开始支持窗口函数,如RANK()、ROW_...

Global site tag (gtag.js) - Google Analytics