场景:由于一些表中设计了一些冗余字段,因此在主表修改了该冗余字段的值得时候,需要动态更新在其他表中冗余字段的值

 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

在此记录一下,方便以后查询以及他人参照。

最新文章

  1. [LeetCode] Delete Duplicate Emails 删除重复邮箱
  2. Saltstack常用模块及API
  3. oracle 高水位线详解
  4. 如何使用java调用DLL运行C++(初篇)
  5. Centos 下搭建SVN + Apache 服务器(转载)
  6. 《工作型PPT设计之道》培训心得
  7. oracle10g前期准备
  8. 基于GBT28181:SIP协议组件开发-----------第五篇SIP注册流程eXosip2实现(二)
  9. [Leetcode][Python]26: Remove Duplicates from Sorted Array
  10. FpGrowth算法
  11. 将百度的ECharts整合到阿里的Weex中。
  12. [IOI2018]高速公路收费——二分查找+bfs
  13. C# 使用委托实现多线程调用窗体的四种方式
  14. vue-demo
  15. laravel框架中报错 DataTables warning: table id=xxx-table - Cannot reinitialise DataTable.
  16. 51nod 1412 AVL树的种类(经典dp)
  17. CRISPR基因编辑
  18. js方法参数问题
  19. HDFS的Read过程分析
  20. Asp.Net MVC 自定义登录过滤器

热门文章

  1. oracle net manager 数据传输安全
  2. 嵌入式:指针的指针、链表、UCOS 的 OSMemCreate 。
  3. DBCacheServer升级
  4. 你不知道的javaScript笔记(7)
  5. 移动设备HTML5页面布局
  6. BZOJ2754: [SCOI2012]喵星球上的点名(AC自动机)
  7. spring boot 小案例
  8. CentOS7下rsync服务的基本详解和使用
  9. js实现前端的搜索历史记录
  10. Docker(一):概述