表结构:
表数据:
期望结果:
虽然这种结果可以通过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秒左右
相关推荐
总结来说,这个示例展示了如何在MySQL存储过程中使用游标进行循环处理,并在循环内部再次嵌套游标以实现更精细的数据操作。这种技术在处理大量数据或执行复杂逻辑时非常有用,尤其是在需要逐行检查和处理数据的情况...
MySQL 游标嵌套实践 本文档旨在介绍 MySQL 游标嵌套的概念和实践,通过对游标的嵌套使用,演示如何实现复杂的数据操作。 一、游标嵌套简介 游标(Cursor)是数据库中的一种控制结构,可以用来遍历查询结果集。...
除了基础的游标操作,MySQL还支持其他特性,如:嵌套游标(一个游标内部使用另一个游标)、可滚动游标(允许向前和向后移动)以及隐式游标(无需显式声明,常在存储过程中使用)。 在实际应用中,游标常常用于以下...
如果需要实现嵌套的游标循环,可以使用 BEGIN 和 END 语句来划分一个statement block,例如: DECLARE fetchSeqOk BOOLEAN; BEGIN DECLARE _seqname VARCHAR(50); DECLARE _value BIGINT(20); DECLARE ...
下面是一个包含嵌套游标循环的示例: ```sql begin -- 嵌套循环的变量和游标定义 ... inner_loop: begin -- 内部游标定义 declare innerCursor cursor for ... -- 内部游标错误处理器 declare continue ...
mysql存储过程 多个游标循环(依次执行,非嵌套循环)REPEAT循环。有需要的可自行下载。
loop 游标双层嵌套循环 创建临时表, 游标
MySQL数据库支持嵌套事务,然而在实际应用中并不常见,因为它们可能会引发一些意料之外的问题。嵌套事务通常指的是在一个事务内部启动另一个事务,这种用法在某些特定情况下可能是必要的,但大多数时候应避免使用。 ...
- 游标的概念和使用:学习如何在循环中逐行处理查询结果,提供更灵活的数据处理能力。 9. **50道myaql不全 不保证准确性.txt** 和 **MySql第二章练习.txt** - 这些可能是面试题目或练习题,涵盖前面提到的各种...
7. **游标**:游标允许在结果集中逐行处理数据,特别是在需要循环遍历结果集时,游标非常实用。理解如何声明、打开、读取和关闭游标,以及在存储过程中如何使用它们。 8. **触发器**:触发器是数据库自动执行的预定...
Oracle中的游标和FOR循环在MySQL中通常需要用DECLARE、OPEN、FETCH和CLOSE等语句来实现,或者直接用嵌套的SELECT语句。 6. **连接与子查询**: Oracle的CONNECT BY用于构建层次查询,而在MySQL中可能需要递归的...
优化存储过程时,应尽量减少嵌套循环和复杂的逻辑判断,使用适当的变量和游标来控制流程。同时,注意参数化查询可以防止SQL注入并提高执行效率。 函数优化通常涉及内置函数的使用和自定义函数的编写。内置函数已经...
MySQL存储过程是一种预编译的SQL代码集合,可以在需要...总结来说,这个例子展示了如何在MySQL中创建和使用存储过程,包括事务控制、参数传递、嵌套调用和游标的使用,是学习和理解MySQL存储过程功能的一个很好的实例。
pymysql 操作MySQL数据库 pymysql 是 Python 中一个流行的 MySQL 客户端库,...pymysql 操作 MySQL 数据库需要注意链接数据库、游标 Cursor、查询操作、插入操作、关闭连接、变量传值、SQL 语句拼接和事务提交等问题。
- 特点: 结合了静态和动态游标的特性,可以通过键集来定位行。 ### 3. 数据库中的连接类型 - **内连接 (INNER JOIN)**: - 说明: 返回两个表中满足连接条件的所有记录。 - **外连接 (OUTER JOIN)**: - **左外连接...
8. **子查询优化**:MySQL对嵌套查询进行了优化,支持子查询嵌套在FROM子句、WHERE子句和HAVING子句中,以满足ANSI SQL的要求。 9. **窗口函数(Window Functions)**:MySQL 8.0开始支持窗口函数,如RANK()、ROW_...