場景:由於一些表中設計了一些冗餘字段,因此在主表修改了該冗餘欄位的值得時候,需要動態更新在其他表中冗餘欄位的值
1begin
2#routine body goes here...34
/*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
18declare done int
default0;
19/*
宣告游標
*/20
declare currow cursor
for21
select
sourcetablename,sourceidfieldname,sourcenamefieldname,targettablename,targetidfieldname,targetnamefieldname
22from
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;
29while done<>1do
30#獲取需要更新的資料
31select sourcenamefieldnewvalue,sourceidfieldvalue into vnewvalue,vsourceidfieldvalue from
db_redundancy.tablefieldvaluemodifylog
32where isprocess=
0and sourcetablename=vsourcetablename and sourceidfieldname=vsourceidfieldname and sourcenamefieldname=
vsourcenamefieldname
33order
by createdate desc limit 1;34
ifisnull(vnewvalue) <>
null
|| length(trim(vnewvalue))>
1then
35#拼接語句
36set vstrsql=concat('
update
',vtargettablename,'
set
', vtargetnamefieldname ,'
= "',vnewvalue,'
" where
', vtargetidfieldname ,'
= ', vsourceidfieldvalue,';'
);37 #注意很重要,將連成成的字串賦值給乙個變數(可以之前沒有定義,但要以@開頭)38
set@vsql
=vstrsql;
39#預處理需要執行的動態sql,其中stmt是乙個變數
40prepare stmt from
@vsql;41
#執行語句
42execute
stmt ;
43#釋放語句
44deallocate
prepare
stmt;
45#更新歷史表中狀態標記
46update db_redundancy.tablefieldvaluemodifylog set isprocess=
1where isprocess=
0and sourcetablename=vsourcetablename and sourceidfieldname=vsourceidfieldname and sourceidfieldvalue=
vsourceidfieldvalue;
47endif;
48#重置資料
49set vnewvalue='';
50set vstrsql='';
51fetch
next
from currow into
vsourcetablename,vsourceidfieldname,vsourcenamefieldname,vtargettablename,vtargetidfieldname,vtargetnamefieldname;
52end
while;53
/*關閉游標
*/54
close
currow;
55end
在此記錄一下,方便以後查詢以及他人參照。
mysql 儲存過程動態拼接sql並執行賦值
處理拼接sql並且是在select查詢拼接時的賦值 create definer current user procedure newproc in xnb varchar 50 begin 定義變數 declare num float 14,6 default 0 表示全域性變數 相當於php 拼...
mysql 動態執行SQL文
參考 mysql 儲存過程中動態執行 sql 文 2 pow mysql prepa re stmt1 from select sqrt pow 2 as hypotenuse mysql set a 3 mysql set b 4 b class userinputexecute stmt1 us...
mysql 動態執行SQL文
在mysql儲存過程中動態執行sql文 mysql prepare stmt1 from select sqrt pow 2 pow 2 as hypotenuse mysql set a 3 mysql set b 4 mysql execute stmt1 using a,b mysql set...