場景:由於一些表中設計了一些冗余字段,因此在主表修改了該冗余字段的值得時候,需要動態更新在其他表中冗余字段的值
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
在此記錄一下,方便以后查詢以及他人參照。