zoukankan      html  css  js  c++  java
  • MySql动态生成SQL并执行

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

     1 BEGIN
     2     #Routine body goes here...
     3    
     4   /*SQL语句变量*/
     5   DECLARE vstrSql VARCHAR(3000) DEFAULT ''; 
     6   /*映射表字段*/
     7   DECLARE vSourceTableName VARCHAR(50);
     8   DECLARE vSourceIdFieldName VARCHAR(50);
     9   DECLARE vSourceNameFieldName VARCHAR(50);
    10   DECLARE vTargetTableName VARCHAR(50);
    11   DECLARE vTargetIdFieldName VARCHAR(50);
    12   DECLARE vTargetNameFieldName VARCHAR(50); 
    13 
    14   /*更新数据*/
    15   DECLARE vnewValue VARCHAR(100);
    16   DECLARE vSourceIdFieldValue VARCHAR(100);
    17 
    18   DECLARE Done INT DEFAULT 0;
    19   /*声明游标*/
    20   DECLARE curRow CURSOR FOR 
    21   SELECT SourceTableName,SourceIdFieldName,SourceNameFieldName,TargetTableName,TargetIdFieldName,TargetNameFieldName
    22   FROM db_redundancy.TableFieldMap;
    23   /*设置终止标记*/
    24   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
    25   /*打开游标*/
    26   OPEN curRow;
    27     /*循环取出数据*/
    28     FETCH NEXT FROM curRow INTO vSourceTableName,vSourceIdFieldName,vSourceNameFieldName,vTargetTableName,vTargetIdFieldName,vTargetNameFieldName;
    29     WHILE Done<>1 DO
    30        #获取需要更新的数据
    31        SELECT SourceNameFieldNewValue,SourceIdFieldValue INTO vnewValue,vSourceIdFieldValue FROM db_redundancy.TableFieldValueModifyLog 
    32        WHERE  IsProcess=0 AND SourceTableName=vSourceTableName AND SourceIdFieldName=vSourceIdFieldName AND SourceNameFieldName=vSourceNameFieldName
    33        ORDER BY CreateDate DESC  limit 1;
    34        IF ISNULL(vnewValue) <> NULL || LENGTH(trim(vnewValue))>1 THEN
    35          #拼接语句
    36          SET vstrSql=CONCAT(' UPDATE ',vTargetTableName,' SET ', vTargetNameFieldName ,' = "',vnewValue,'" WHERE ', vTargetIdFieldName ,' = ', vSourceIdFieldValue,';');
    37          #注意很重要,将连成成的字符串赋值给一个变量(可以之前没有定义,但要以@开头38          SET @vSql= vstrSql;
    39          #预处理需要执行的动态SQL,其中stmt是一个变量
    40          PREPARE stmt  FROM @vSql;
    41          #执行语句
    42          EXECUTE stmt ;
    43          #释放语句
    44          DEALLOCATE PREPARE  stmt;
    45          #更新历史表中状态标记
    46          UPDATE db_redundancy.TableFieldValueModifyLog SET IsProcess=1 WHERE IsProcess=0 AND SourceTableName=vSourceTableName AND SourceIdFieldName=vSourceIdFieldName AND SourceIdFieldValue=vSourceIdFieldValue;
    47        END IF;
    48        #重置数据
    49        SET vnewValue='';
    50        SET vstrSql='';
    51       FETCH NEXT FROM curRow INTO vSourceTableName,vSourceIdFieldName,vSourceNameFieldName,vTargetTableName,vTargetIdFieldName,vTargetNameFieldName;
    52     END WHILE;
    53   /*关闭游标*/
    54   CLOSE curRow;
    55 END

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

  • 相关阅读:
    读写excel的组件
    一个关于C#语言中的Property的低级BUG,花了我二十分钟
    使用wwAppConfiguration类库来轻松读写应用程序配置信息
    为因地震死难的同胞默哀
    页面执行时生成静态文件的方法
    【转载】sp_spaceused2,看库里全部表占用的物理空间
    在微软中文技术论坛 CSDN cnblogs 三个微软社区中提问
    在内网服务器中获得真正的客户端ip的方法
    深拷贝的通用方法
    你知道在word中如何将段落标记替换成其他字符吗?
  • 原文地址:https://www.cnblogs.com/ganqiyin/p/5091872.html
Copyright © 2011-2022 走看看