MySql动态生成SQL并执行
2024-09-04 15:05:04
场景:由于一些表中设计了一些冗余字段,因此在主表修改了该冗余字段的值得时候,需要动态更新在其他表中冗余字段的值
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
在此记录一下,方便以后查询以及他人参照。
最新文章
- [LeetCode] Delete Duplicate Emails 删除重复邮箱
- Saltstack常用模块及API
- oracle 高水位线详解
- 如何使用java调用DLL运行C++(初篇)
- Centos 下搭建SVN + Apache 服务器(转载)
- 《工作型PPT设计之道》培训心得
- oracle10g前期准备
- 基于GBT28181:SIP协议组件开发-----------第五篇SIP注册流程eXosip2实现(二)
- [Leetcode][Python]26: Remove Duplicates from Sorted Array
- FpGrowth算法
- 将百度的ECharts整合到阿里的Weex中。
- [IOI2018]高速公路收费——二分查找+bfs
- C# 使用委托实现多线程调用窗体的四种方式
- vue-demo
- laravel框架中报错 DataTables warning: table id=xxx-table - Cannot reinitialise DataTable.
- 51nod 1412 AVL树的种类(经典dp)
- CRISPR基因编辑
- js方法参数问题
- HDFS的Read过程分析
- Asp.Net MVC 自定义登录过滤器