MySql动态生成SQL并执行
场景:由于一些表中设计了一些冗余字段,因此在主表修改了该冗余字段的值得时候,需要动态更新在其他表中冗余字段的值
BEGIN
#Routine body goes here... /*SQL语句变量*/
DECLARE vstrSql VARCHAR(3000) DEFAULT '';
/*映射表字段*/
DECLARE vSourceTableName VARCHAR(50);
DECLARE vSourceIdFieldName VARCHAR(50);
DECLARE vSourceNameFieldName VARCHAR(50);
DECLARE vTargetTableName VARCHAR(50);
DECLARE vTargetIdFieldName VARCHAR(50);
DECLARE vTargetNameFieldName VARCHAR(50); /*更新数据*/
DECLARE vnewValue VARCHAR(100);
DECLARE vSourceIdFieldValue VARCHAR(100); DECLARE Done INT DEFAULT 0;
/*声明游标*/
DECLARE curRow CURSOR FOR
SELECT SourceTableName,SourceIdFieldName,SourceNameFieldName,TargetTableName,TargetIdFieldName,TargetNameFieldName
FROM db_redundancy.TableFieldMap;
/*设置终止标记*/
DECLARE CONTINUE HANDLER FOR SQLSTATE '' SET Done = 1;
/*打开游标*/
OPEN curRow;
/*循环取出数据*/
FETCH NEXT FROM curRow INTO vSourceTableName,vSourceIdFieldName,vSourceNameFieldName,vTargetTableName,vTargetIdFieldName,vTargetNameFieldName;
WHILE Done<>1 DO
#获取需要更新的数据
SELECT SourceNameFieldNewValue,SourceIdFieldValue INTO vnewValue,vSourceIdFieldValue FROM db_redundancy.TableFieldValueModifyLog
WHERE IsProcess=0 AND SourceTableName=vSourceTableName AND SourceIdFieldName=vSourceIdFieldName AND SourceNameFieldName=vSourceNameFieldName
ORDER BY CreateDate DESC limit 1;
IF ISNULL(vnewValue) <> NULL || LENGTH(trim(vnewValue))>1 THEN
#拼接语句
SET vstrSql=CONCAT(' UPDATE ',vTargetTableName,' SET ', vTargetNameFieldName ,' = "',vnewValue,'" WHERE ', vTargetIdFieldName ,' = ', vSourceIdFieldValue,';');
#注意很重要,将连成成的字符串赋值给一个变量(可以之前没有定义,但要以@开头)
SET @vSql= vstrSql;
#预处理需要执行的动态SQL,其中stmt是一个变量
PREPARE stmt FROM @vSql;
#执行语句
EXECUTE stmt ;
#释放语句
DEALLOCATE PREPARE stmt;
#更新历史表中状态标记
UPDATE db_redundancy.TableFieldValueModifyLog SET IsProcess=1 WHERE IsProcess=0 AND SourceTableName=vSourceTableName AND SourceIdFieldName=vSourceIdFieldName AND SourceIdFieldValue=vSourceIdFieldValue;
END IF;
#重置数据
SET vnewValue='';
SET vstrSql='';
FETCH NEXT FROM curRow INTO vSourceTableName,vSourceIdFieldName,vSourceNameFieldName,vTargetTableName,vTargetIdFieldName,vTargetNameFieldName;
END WHILE;
/*关闭游标*/
CLOSE curRow;
END
在此记录一下,方便以后查询以及他人参照。
MySql动态生成SQL并执行的更多相关文章
- 模拟Hibernate动态生成SQL语句
这里有一个xml配置文件,也就是Hibernate框架中会用到的POJO和数据库的映射文件 <?xml version="1.0" encoding="utf-8& ...
- mysql体系结构和sql查询执行过程简析
一: mysql体系结构 1)Connectors 不同语言与 SQL 的交互 2)Management Serveices & Utilities 系统管理和控制工具 备份和恢复的安全性,复 ...
- PowerDesigner16.5 生成SQL脚本执行出错:collate chinese_prc_ci_as
PowerDesigner16.5 生成SQL脚本执行出错, collate chinese_prc_ci_as 点DataBase-edit current dbms —— 左边Script - O ...
- 如何根据实体动态生成sql语句
该文章同时解决了,如何向数据库中添加Null值,以及如何处理“参数化查询未提供参数”的错误.解决方案请看第二段折叠的代码. 背景: 在项目开发的过程中,往往需要根据实体的值来修改sql语句,比如说,有 ...
- mybatis使用注解替代xml配置,动态生成Sql
mybatis使用注解替代xml配置时,遇到判断条件是否为null或者为空时,@Select很难搞定,不知道怎么办? mybatis3中增加了使用注解来配置Mapper的新特性,使用 SelectPr ...
- java 动态生成SQL
代码如下: /** * 动态生成SQ及SQL参数L * @param ve 接收到的消息的CHGLIST * @param paramList MQ消息中的SQL参数 * @param t 泛型对象 ...
- Mysql explain分析sql语句执行效率
mysql优化–explain分析sql语句执行效率 Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 ...
- mysql 存储过程动态拼接sql并执行赋值
)) BEGIN ## 定义变量 ,) ; ## @表示全局变量 相当于php $ ## 拼接赋值 INTO 必须要用全局变量不然语句会报错 SET @strsql = CONCAT('SELECT ...
- 动态生成SQL执行语句
SET @qry = 'SELECT product_cd, name, product_type_cd, date_offered, date_retired FROM product WHERE ...
随机推荐
- 执行计划sql
我准备开始分析并优化我的查询.在分析之前,我想到了一些问题. MS-SQL Server什么时候使用"Table Scan"? MS-SQL Server什么时候使用"I ...
- pushlet(QQ提示框)
Pushlet 实现服务端往客服端推送消息 系统页面弹出消息框,类似QQ提示框 1. java代码 package com.test.jbpm.common; import java.io.Seria ...
- c++stl应用入门
在这篇中,我会讲几个简单易懂且比较常用的stl函数,这些函数在noip系列考试中往往被允许使用(既然让用我们自然不用手码了...) (末尾有惊喜!) 1.sort 绝大部分刚入门的oier第一个接触的 ...
- ABAP术语-Object Type
Object Type 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/06/1093159.html Description created ...
- raid概述与CentOS7.4中raid5的搭建与测试
前言 一.raid的定义与作用 raid(独立冗余磁盘阵列).raid技术通过把多个硬盘设备组合成一个容量更大的,安全性更好的磁盘阵列.把数据切割成许多区段后分别放在不同的物理磁盘上,然后利用分散读写 ...
- 解决url传递过程中加号变空格的问题
url传递过程中加号变空格 在接收url参数的过程中,会发现如果参数中存在‘+’号,接收后会变成空格. 如11+22接收后变成11 22. 要解决这个问题,需要将加号替换为%2B进行传递. 如11%2 ...
- 系统编程.py(多进程与多线程干货)
1.并发与并行* 多个任务轮换在CPU上跑叫并发* 多个任务在多个CPU上跑,没有交替执行的* 状态叫并行.通常情况下都是并发,即使是多核.* 而控制进程先执行谁后执行谁通过操作系统的调度算法.目前已 ...
- MySQL wait_timeout参数修改
MySQL wait_timeout参数修改问题,可能经常会有DBA遇到过,下面就试验一下并看看会有什么现象. wait_timeout分为global级及session级别,如未进行配置,默认值为2 ...
- Python3爬虫(一)HTTP相关基础
Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.URI.URL.URN.HTTP URI:统一资源标志符 URL:是URI的一个子集 URN:是URI的另一个 ...
- FZU:1759-Problem 1759 Super A^B mod C (欧拉降幂)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1759 欧拉降幂是用来干啥的?例如一个问题AB mod c,当B特别大的时候int或者longlong装不下的时 ...