`

MYSQL游标嵌套循环示例

    博客分类:
  • SQL
阅读更多

本文将举例演示游标的嵌套用法,首先建造表结构,如下:

drop table if exists `tb_user`;
create table tb_user (
	id bigint(22) not null auto_increment primary key,
    name varchar(20) not NULL,
    age  tinyint(3),
    gmt_create date,
    gmt_modified date
);

drop table if exists `tb_user_param`;
create table tb_user_param (
	id bigint(22) not null auto_increment primary key,
    user_id bigint(22) not null,
    code varchar(100) not null,
    value varchar(1000),
    gmt_create DATE,
    gmt_modified date
);

drop procedure if exists `sp_init_data`;
create procedure `sp_init_data`()
begin
	declare v_i bigint(22) default 0;
    declare v_uid bigint(22);
    declare v_nick varchar(20) default 'lanbo_';
    declare v_code_1 varchar(20) default 'address';
    declare v_code_2 varchar(20) default 'phone';
    declare v_code_3 varchar(20) default 'wangwang_id';
    declare v_value_1 varchar(20) default 'HZ.XiHu';
    declare v_value_2 varchar(20) default '1875757198';
    declare v_value_3 varchar(20) default 'shansun_';
	
    while v_i < 10 do
    	set v_i = v_i + 1;
    	insert into tb_user values (null, concat(v_nick, v_i), 23, now(), now()); 
        select LAST_INSERT_ID() into v_uid; 
        insert into tb_user_param values(null, v_uid, v_code_1, v_value_1, now(), now());
        insert into tb_user_param values(null, v_uid, v_code_2, concat(v_value_2, v_i), now(), now());
        insert into tb_user_param values(null, v_uid, v_code_3, concat(v_value_3, v_i), now(), now());
    end while;    
    commit;
end;
call sp_init_data();


drop table if exists `tb_key_value`;
create table `tb_key_value`(
	uid bigint(22) not null,
	k varchar(100),
    v varchar(100)
);

我们插入了10条数据到tb_user中,如果tb_user中未定义的字段如address,则放置在tb_user_param中,该表是个key_value的结构,由uid+code定位。

后面我们要做的是,将根据tb_user中的uid找到tb_user_param中相关记录后,将key_value信息转移到tb_key_value表中,为达到演示效果,我们使用嵌套游标操作数据,代码如下:

drop procedure if exists `sp_nested_cursor`;
create procedure `sp_nested_cursor`()
begin
	declare v_uid bigint(22);
    declare v_code varchar(100);
    declare v_value varchar(100);
    declare _done TINYINT(1) default 0;
	declare cur_user cursor for select id from `tb_user`;
    declare continue handler for not found set _done = 1;
    
    open cur_user;
    loop_xxx:loop
    	fetch cur_user into v_uid;
        if _done=1 then
        	leave loop_xxx;
        end if;
        begin
        	declare _inner tinyint(1) default 0;
        	declare cur_param cursor for select code, value 
                                         from `tb_user_param` 
                                         where user_id=v_uid;
            declare continue handler for not found set _inner = 1; 
            open cur_param;
            loop_yyy:loop
            	fetch cur_param into v_code, v_value;
                if _inner=1 then
                	leave loop_yyy;
                end if;
                insert into tb_key_value values (v_uid, v_code, v_value);
            end loop;
            commit;
        end;
    end loop;
end;
call `sp_nested_cursor`();
 如果想跟踪上面程序的执行过程,可以借助MySQL Debugger工具调试学习。
分享到:
评论
1 楼 svygh123 2014-08-23  
你的游标都没有关闭呢!

相关推荐

    mysql游标嵌套[文].pdf

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

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

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

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

    以上就是MySQL游标的定义、使用和关闭的基本概念以及如何处理游标循环的细节。理解这些概念对于编写涉及复杂数据处理的存储过程至关重要。记住,游标虽然提供了逐行处理数据的能力,但也需要注意性能影响,因为它们...

    mysql 存储过程输入输出参数示例

    drop PROCEDURE if exists my_procedure; create PROCEDURE my_procedure(in my_id int,out my_name... 您可能感兴趣的文章:Mysql存储过程循环内嵌套使用游标示例代码MySQL 存储过程中执行动态SQL语句的方法Mysql存储过

    最好的PHP+MYSQL中文教程

    此外,还将深入到更复杂的SQL操作,如JOIN用于联接多个表,子查询用于嵌套查询,以及视图和存储过程的使用。 两者结合的部分,教程会展示如何在PHP中连接MySQL数据库,执行SQL查询,处理查询结果,并将数据动态显示...

    mysql存储过程之代码块条件控制迭代.docx

    总的来说,MySQL存储过程中的代码块、条件控制、迭代以及游标和处理器的使用,共同构建了一个强大的数据库编程环境,能够处理复杂的业务逻辑和数据操作。理解并熟练掌握这些概念,对于提升数据库应用的效率和灵活性...

    Python实现导出数据生成excel报表的方法示例

    5. **循环遍历数据**:在`write_data_to_excel`函数中,通过两个嵌套的for循环遍历查询结果的每一行和每一列。`sheet.write(i, j, result[i][j])`将数据写入Excel单元格,其中i和j分别代表行号和列号。 6. **文件...

    MySQL学习笔记2-高级查询与存储.md

    子查询指的是在一个查询语句内部嵌套另一个查询语句。这种查询方式能够根据内层查询的结果来进一步筛选外层查询的条件或结果集。 **应用场景**:例如,我们需要找出所有部门名称为“HR”的员工的名字,可以通过如下...

    经典SQL学习资料下载地址,包你满意!

    - 游标操作:了解游标的创建、打开、读取和关闭等操作步骤。 #### 七、Oracle数据库ISO镜像下载 提供Oracle数据库的ISO镜像文件下载链接,方便用户进行安装部署。 - **Oracle数据库安装**: - 镜像文件获取:...

    数据库(SQL ORCAl)参考手册

    - **FOR的使用**:使用FOR循环处理游标。 - **BULK COLLECT使用**:一次性获取多行数据。 - **SELECT INTO的使用方式**:将查询结果赋值给变量。 - **FETCH INTO的使用方式**:从游标中获取数据并赋值给变量。 - **...

    SQL必知必会-中文第4版1

    新版的《SQL必知必会》还更新了针对不同数据库管理系统(DBMS)的示例,如Apache OpenOffice Base、MariaDB、SQLite、Oracle、SQL Server、MySQL和PostgreSQL。这使得读者能更好地理解和适应各种环境下的SQL使用。 ...

    一点sql语句总结

    SQL(Structured Query Language)是一种用于管理关系数据库的标准语言,它被广泛应用于各种数据库管理系统中,如MySQL、Oracle、SQL Server等。这篇博客“一点sql语句总结”可能涵盖了SQL的基本概念、常用操作以及...

    SQL 参考手册,标准版

    SQL(Structured Query Language)是用于管理和处理关系数据库的标准编程语言,它被广泛应用于各种数据库管理系统,如MySQL、Oracle、SQL Server等。SQL 参考手册是数据库管理员、开发者和数据分析人员的重要工具,...

    存储过程

    提供的文档《SQL存储过程实例.docx》和《sql存储过程教程.txt》应包含更多具体的示例和实践指导,帮助深入理解和掌握存储过程的使用。 总结,存储过程是数据库中的重要工具,它提升了效率,增强了安全性,并简化了...

    活动活动大脑的一个稍微复杂一点的sql

    11. **游标(Cursor)**:允许程序逐行处理查询结果,常在需要逐行处理数据或在循环中操作数据时使用。 12. **SQL优化**:包括选择合适的索引、避免全表扫描、减少子查询、优化联接操作等,以提高查询性能。 如果...

    50个常用sql语句

    18. **游标**:允许逐行处理查询结果,常用于循环处理大量数据。 19. **事务**:一组操作,要么全部成功,要么全部回滚,确保数据一致性,如`BEGIN TRANSACTION; ...; COMMIT/ROLLBACK`。 20. **权限管理**:`...

    超详细Oracle教程(带目录).pdf

    - **游标**:CURSOR的使用及其在循环处理中的作用。 - **函数**:内置函数和用户自定义函数的定义及使用方法。 #### 二十一、存储过程 - **存储过程定义**:PROCEDURE的创建和调用。 - **存储过程的优点**:提高...

    javaSE代码实例

    4.1.3 语句的嵌套 43 4.2 switch多分支语句 45 4.2.1 基本语法 45 4.2.2 合法的判断表达式 46 4.2.3 合法的case表达式 47 4.2.4 详细执行流程 49 4.3 while循环语句 50 4.4 do-while循环语句 52 4.5...

Global site tag (gtag.js) - Google Analytics