`

mysql存储过程 嵌套查询

 
阅读更多
DELIMITER $$
CREATE PROCEDURE test_cursor(IN studyId Long)
BEGIN
-- 需要执行的SQL语句
DECLARE v_sql_1 VARCHAR(2000);
DECLARE v_sql_2 VARCHAR(2000);


  /*定义变量*/
DECLARE crf_form_id Long;
DECLARE table_name VARCHAR(255);

DECLARE field_sql VARCHAR(2000);


-- 定义循环标识,默认值为 FALSE
DECLARE done INT DEFAULT FALSE;

  -- 定义游标,并将sql结果集赋值到游标中
DECLARE My_Cursor CURSOR FOR (
select
c.id, c.table_name
from
study s, crf c, study_crf sc
where
s.id=sc.study_id
and c.id=sc.crf_form_id
and s.deleted=0
and c.deleted=0
and c.generate_to_db=1
and c.table_name is not null
and s.id=studyId
   );


  -- 将结束标志绑定到游标,若没有数据返回,程序继续,并将变量done设为TRUE
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;


  -- 打开游标
OPEN My_Cursor;

      myLoop2 : LOOP

      -- 循环游标中的数据,并赋值到变量中
FETCH My_Cursor INTO crf_form_id, table_name ;

IF done THEN
LEAVE myLoop2;

      ELSE

-- 动态拼接sql并赋值v_sql_1
SET v_sql_1 = CONCAT('
select 
GROUP_CONCAT(cdf.field_name, " as \'", f.label, "\'") into @param1
from
crf_dict_field cdf, study_crf sc, dictionary d, field f
where cdf.crf_form_id=sc.crf_form_id
and cdf.dict_id=d.id
and cdf.field_id=f.id
and cdf.deleted=0
and d.deleted=0
and f.deleted=0
and cdf.generate_to_db=1
and cdf.field_name is not null
and cdf.crf_form_id=', crf_form_id, ' and sc.study_id=', studyId
);
-- 需要用@转换下,直接v_sql_1执行不了
SET @sql_1 = v_sql_1;
-- 预处理需要执行的动态SQL,其中stmt是一个变量
PREPARE stmt1 FROM @sql_1; 
-- 执行SQL语句
EXECUTE stmt1;  
-- 释放掉预处理段  
DEALLOCATE PREPARE stmt1;    
-- @param1赋值给maxId2
SET field_sql = @param1;


-- 动态拼接sql并赋值v_sql_2
SET v_sql_2 = CONCAT('select id, objectId, ', field_sql, ' from ', table_name, ' where deleted=0 and objectId in (select so.id from study_object so where so.deleted=0 and so.study_id=', studyId, ') ');
SET @sql_2 = v_sql_2;
-- 预处理需要执行的动态SQL,其中stmt是一个变量
PREPARE stmt2 FROM @sql_2; 
-- 执行SQL语句
EXECUTE stmt2;  
-- 释放掉预处理段  
DEALLOCATE PREPARE stmt2;   



-- 嵌套使用是内部游标结束后给done置 FALSE
SET done=FALSE;

END IF;

    END LOOP myLoop2;

-- 关闭游标
CLOSE My_Cursor;
END
$$
DELIMITER ;
  
分享到:
评论

相关推荐

    mysql存储过程双层嵌套

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

    mysql存储过程教程

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预编译一系列SQL语句并封装成一个可重复使用的单元,从而提高数据处理的效率和代码的复用性。本教程将深入探讨MySQL存储过程的创建、调用以及相关概念...

    MySQL数据库:存储过程嵌套.pptx

    存储过程嵌套 课程目标 1)理解 ——存储过程嵌套的概念; 2)掌握 —— 存储过程嵌套的使用; 存储过程嵌套 【例】 创建一个存储过程sell_insert(),作用是向Sell表中插入一行数据。创建另外一个存储过程sell_...

    mysql 存储过程嵌套循环demo

    mysql存储过程,REPEAT+while 实现嵌套循环。循环内嵌套循环。

    MySQL 存储过程入门到精通

    MySQL存储过程是数据库管理系统中的一个重要特性,它允许程序员或数据库管理员预先定义一组SQL语句,形成一个可重用的逻辑单元。在这个“MySQL存储过程入门到精通”资料中,你将深入理解存储过程的原理、创建、调用...

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

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

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

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

    中文版MySQL5之存储过程技术手册

    它们可以接受多个参数,返回多个结果集,甚至可以嵌套调用其他存储过程。此外,MySQL还支持局部变量和游标,使得在存储过程中处理数据更加灵活。 在性能优化方面,存储过程可以通过缓存执行计划来提升数据库性能。...

    MySQL5新特性之存储过程MySQL5新特性之存储过程

    3. **嵌套存储过程**:MySQL5支持在存储过程中调用其他存储过程,这使得可以构建更复杂的数据处理逻辑,提高代码组织的层次性。 4. **异常处理**:通过`DECLARE`、`BEGIN...END`和`HANDLER`语句,MySQL5提供了错误...

    MySql存储过程和函数

    MySQL存储过程和函数是数据库管理中的重要组成部分,它们在数据处理和业务逻辑中扮演着核心角色。本篇文章将深入探讨这两个概念,以及它们在MySQL环境中的应用和差异。 首先,让我们了解一下存储过程。存储过程是一...

    MySQL存储过程:数据库编程的高级艺术

    ### MySQL存储过程:数据库编程的高级艺术 #### 引言:存储过程的魔力 存储过程作为数据库领域中的一种高级特性,在提升数据处理效率及增强安全性方面扮演着至关重要的角色。MySQL作为广受青睐的关系型数据库管理...

    MySQL 5.0存储过程

    MySQL 5.0版本还引入了几个新特性,比如支持嵌套存储过程、游标和事务控制。嵌套存储过程允许在一个过程中调用另一个过程,增加了代码的模块化和复用性。游标则允许在过程内部逐行处理结果集,这对于迭代操作非常...

    MySQL5.0存储过程

    此外,存储过程还可以嵌套,即在一个存储过程中调用另一个存储过程,这样可以构建更复杂的逻辑结构。同时,存储过程的权限管理也是很重要的,MySQL提供了GRANT和REVOKE语句来控制对存储过程的访问权限。 在实际应用...

    创建存储过程.rar

    1. 尽可能减少嵌套层次,避免过于复杂的存储过程。 2. 为存储过程提供清晰的注释,方便维护。 3. 考虑性能,合理设计参数和返回值,避免全表扫描。 4. 注意数据库兼容性,如果应用需要跨数据库迁移,应确保存储过程...

    MySQL+5.0存储过程

    10. **嵌套存储过程**:MySQL 5.0允许在一个存储过程中调用另一个存储过程,实现更复杂的逻辑结构。 通过了解和掌握这些特性,开发者能够更有效地利用MySQL 5.0存储过程来构建高效、可靠的数据库应用。提供的...

Global site tag (gtag.js) - Google Analytics