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

在此記錄一下,方便以后查詢以及他人參照。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM