MySql動態生成SQL並執行

2022-01-11 06:02:06 字數 3054 閱讀 1781

場景:由於一些表中設計了一些冗餘字段,因此在主表修改了該冗餘欄位的值得時候,需要動態更新在其他表中冗餘欄位的值

1

begin

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...