`
yanwei11911011
  • 浏览: 16291 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类

写MySQL存储过程实现动态执行SQL (转)

阅读更多
--存储过程名和参数,参数中in表示传入参数,out标示传出参数,inout表示传入传出参数

create procedure p_procedurecode(in sumdate varchar(10))   
begin
     declare v_sql varchar(500);    --需要执行的SQL语句
     declare sym varchar(6);
     
     declare var1 varchar(20);
     declare var2 varchar(70);
     declare var3 integer;

     --定义游标遍历时,作为判断是否遍历完全部记录的标记
     declare no_more_departments integer DEFAULT 0;     

     --定义游标名字为C_RESULT 
     DECLARE C_RESULT CURSOR FOR
             SELECT barcode,barname,barnum FROM tmp_table;

    --声明当游标遍历完全部记录后将标志变量置成某个值
     DECLARE CONTINUE HANDLER FOR NOT FOUND
             SET no_more_departments=1;

     set sym=substring(sumdate,1,6);     --截取字符串,并将其赋值给一个遍历

     --连接字符串构成完整SQL语句,动态SQL执行后的结果记录集,在MySQL中无法获取,因此需要转变思路将其放置到一个临时表中(注意代码中的写法)。一般写法如下:

     --     'Create TEMPORARY Table   表名(Select的查询语句);
     set v_sql= concat('Create TEMPORARY Table tmp_table(select aa as aacode,bb as aaname,count(cc) as ccnum from h',sym,' where substring(dd,1,8)=''',sumdate,''' group by aa,bb)');

     set @v_sql=v_sql;   --注意很重要,将连成成的字符串赋值给一个变量(可以之前没有定义,但要以@开头)
     prepare stmt from @v_sql;  --预处理需要执行的动态SQL,其中stmt是一个变量
     EXECUTE stmt;      --执行SQL语句
     deallocate prepare stmt;     --释放掉预处理段

     OPEN C_RESULT;       --打开之前定义的游标
     REPEAT                      --循环语句的关键词
           FETCH C_RESULT INTO VAR1, VAR2, VAR3;   --取出每条记录并赋值给相关变量,注意顺序

          --执行查询语句,并将获得的值付给一个变量 @oldaacode(注意如果以@开头的变量可以不用通过declare语句事先声明)
           select @oldaacode:=vcaaCode from T_sum where vcaaCode=var1 and dtDate=sumdate; 
           if @oldaacode=var1 then    --判断
              update T_sum set iNum=var3 where vcaaCode=var1 and dtDate=sumdate;
           else
               insert into T_sum(vcaaCode,vcaaName,iNum,dtDate) values(var1,var2,var3,sumdate);
           end if;
     UNTIL no_more_departments  END REPEAT;    --循环语句结束
     CLOSE C_RESULT;                            --关闭游标

     DROP TEMPORARY TABLE tmp_table;       --删除临时表
end;
分享到:
评论

相关推荐

    MySQL 存储过程中执行动态SQL语句的方法

    以下将详细解释如何在MySQL存储过程中执行动态SQL语句。 首先,我们来看一个简单的例子: ```sql DROP PROCEDURE IF EXISTS my_procedure; CREATE PROCEDURE my_procedure() BEGIN DECLARE my_sql VARCHAR(500); ...

    MySQL存储过程中实现执行动态SQL语句的方法

    以下是一个实例,展示了如何在MySQL存储过程中实现执行动态SQL语句的方法: 首先,我们创建一个名为`set_col_value`的存储过程,它接受四个输入参数: 1. `in_table`:表示要更新的表名。 2. `in_column`:表示要...

    Java实现调用MySQL存储过程详解

    总的来说,Java通过JDBC调用MySQL存储过程涉及到连接数据库、创建`CallableStatement`、执行存储过程和处理结果。这使得开发者能够在Java应用中灵活地利用数据库提供的强大功能,实现更高效的数据处理。

    Oracle Sql语句转换成Mysql Sql语句

    4. **游标**:Oracle SQL支持游标,MySQL则不直接支持,需要使用存储过程或临时表来实现类似功能。 5. **函数和操作符**:两者内置的函数和操作符有所不同,例如Oracle的NVL对应MySQL的IFNULL,Oracle的TO_DATE对应...

    mysql存储过程 在动态SQL内获取返回值的方法详解

    本篇文章将深入探讨如何在MySQL存储过程中实现这一目标。 首先,我们来看一个示例存储过程,它实现了通用的分页查询功能。在这个过程中,有多个输入参数如列名、表名、筛选条件、排序方式、页码和每页大小,以及两...

    mysql存储过程实现分页

    ### MySQL存储过程实现分页 #### 背景与需求 在数据库操作中,分页是一种常见的需求,尤其是在处理大量数据时。通过分页技术,可以有效地减少每次查询的数据量,提高系统的响应速度和用户体验。MySQL作为一种广泛...

    mysql存储过程教程

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

    MySQL存储过程的异常处理方法

    本实例展示了如何在MySQL存储过程中实现异常处理,以捕获并处理可能出现的错误。 首先,我们注意到在创建存储过程`myProc`时,使用了`delimiter $$`来改变MySQL客户端的语句分隔符,这是为了在存储过程中使用多个...

    mysql 查询存储过程的 sql 语句.docx

    存储过程的主要优势在于能够简化复杂的 SQL 查询,执行常见的任务,以及实现数据逻辑。通过使用存储过程,开发者可以在一次操作中执行多个 SQL 语句和逻辑处理。 #### 二、创建存储过程 创建存储过程需要用到 `...

    SQL Server数据库数据转MySQL工具

    "SQL Server数据库数据转MySQL工具"正是一款解决这一问题的专业软件,它允许用户方便地将SQL Server中的数据转换到MySQL环境中。 SQL Server是一款由微软公司开发的关系型数据库管理系统(RDBMS),广泛应用于企业...

    sql动态行转列 存储过程

    在本案例中,我们主要探讨如何使用SQL语句,尤其是存储过程,来实现动态的行转列功能。这在处理具有多个分类或时间序列的数据时特别有用,可以更直观地展示数据。 首先,我们需要创建一个存储过程来执行这个操作。...

    mysql存储过程动态创建多列

    此时,存储过程就展现出了它的强大能力,它允许我们通过编程的方式动态生成并执行SQL语句,从而实现动态创建多列的功能。 #### 动态创建列的实现 下面的示例代码展示了如何在MySQL存储过程中动态创建多列: ```...

    Oracle数据库sql转换mysql数据库工具

    总之,"Oracle数据库sql转换mysql数据库工具"是为了简化数据库迁移过程而设计的,通过自动化的方式,降低了数据库系统切换的复杂性和风险。在实际操作中,用户应根据自身需求,结合这些工具,遵循最佳实践,确保迁移...

    ansible执行mysql sql 脚本

    本话题聚焦于如何使用Ansible执行MySQL的SQL脚本,以实现数据库的自动化操作。我们将探讨Ansible的基本概念、MySQL的SQL脚本操作以及两者结合的具体实践。 首先,Ansible是一款基于Python的自动化工具,它通过SSH...

    mysql经典教程+mysql存储过程讲解

    总的来说,通过学习“mysql经典教程+mysql存储过程讲解”,你不仅可以掌握MySQL的基础操作,还能深入了解如何利用存储过程、触发器和游标来实现更复杂的数据管理策略。这将有助于你成为一名更高效的数据库管理员或...

    玩转MySQL存储过程

    ### 玩转MySQL存储过程 #### 一、存储过程简介及优势 存储过程是一种预编译的SQL语句集合,存储在数据库中,通过指定名称及其参数来调用执行。这种特性使得存储过程能够在执行时更加高效地完成特定任务。 **主要...

    MySQL存储过程编程.pdf

    MySQL 存储过程编程是指在 MySQL 数据库中使用存储过程来实现业务逻辑的编程技术。存储过程是一种可以在数据库中存储和执行的程序单元,它可以实现复杂的业务逻辑和数据处理操作。 在 MySQL 5.0 中,存储过程的...

    MySQL实现创建存储过程并循环添加记录的方法

    在MySQL数据库中,存储过程是一种预编译的SQL语句集合,它可以封装一系列的操作,用于执行复杂的业务逻辑。创建存储过程并循环添加记录是数据库管理中的常见任务,尤其是在需要批量插入数据时。以下将详细解释如何在...

Global site tag (gtag.js) - Google Analytics