mysql 過程 動態執行sql

2021-07-10 18:27:46 字數 2905 閱讀 2545

begin

declare v_sql varchar(500);  

declare v_table_name varchar(20);

declare v_date_time varchar(20);  

set v_date_time=date_format(now(),'%y%m%d');

select v_date_time;

set  v_table_name='test';

set v_sql=concat('alter table ',  v_table_name, ' add partition (partition  p20160404 values less than (736454) ) ') ;

set @v_sql=v_sql ;

prepare stmt from @v_sql; 

execute stmt; 

deallocate prepare stmt;    

end

-

儲存過程名和引數,引數中in表示傳入引數,out標示傳出引數,inout表示傳入傳出引數

create

procedure p_procedurecode(in sumdate varchar(10))

begin

declare v_sql varchar(500); --

需要執行的sql語句

declare sym varchar(6);

declare var1 varchar(20);

declare var2 varchar(70);

declare var3 integer

;

--定義游標遍歷時,作為判斷是否遍歷完全部記錄的標記

declare no_more_departments integer

default

0;

--定義游標名字為c_result

declare c_result cursor

forselect barcode,barname,barnum from

tmp_table;

--宣告當游標遍歷完全部記錄後將標誌變數置成某個值

declare

continue handler for

notfound

set no_more_departments=

1;

set sym=

substring(sumdate,1,6); --

擷取字串,並將其賦值給乙個遍歷

--連線字串構成完整sql語句,動態sql執行後的結果記錄集,在mysql中無法獲取,因此需要轉變思路將其放置到乙個臨時表中(注意**中的寫法)。一般寫法如下:

--'create temporary table 表名(select的查詢語句);

set v_sql= concat('

create temporary table tmp_table(select aa as aacode,bb as aaname,count(cc) as ccnum from h

',sym,'

where substring(dd,1,8)=

''',sumdate,'''

group by aa,bb)');

set@v_sql

=v_sql; --

注意很重要,將連成成的字串賦值給乙個變數(可以之前沒有定義,但要以@開頭)

prepare stmt from

@v_sql; --

預處理需要執行的動態sql,其中stmt是乙個變數

execute stmt; --

執行sql語句

deallocate

prepare stmt; --

釋放掉預處理段

open c_result; --

開啟之前定義的游標

repeat --

fetch c_result into var1, var2, var3; --

取出每條記錄並賦值給相關變數,注意順序

--執行查詢語句,並將獲得的值付給乙個變數 @oldaacode(注意如果以@開頭的變數可以不用通過declare語句事先宣告)

select

@oldaacode:=vcaacode from t_sum where vcaacode=var1 and dtdate=

sumdate;

if@oldaacode

=var1 then

--判斷

update t_sum set inum=var3 where vcaacode=var1 and dtdate=

sumdate;

else

insert

into t_sum(vcaacode,vcaaname,inum,dtdate) values

(var1,var2,var3,sumdate);

endif

; until no_more_departments

end repeat; --

迴圈語句結束

close c_result; --

關閉游標

drop

temporary

table tmp_table; --

刪除臨時表

end;

MySQL 儲存過程動態執行 sql

儲存過程名和引數,引數中in表示傳入引數,out標示傳出引數,inout表示傳入傳出引數 create procedure p procedurecode in sumdate varchar 10 begin declare v sql varchar 500 需要執行的sql語句 declare...

寫MySQL儲存過程實現動態執行SQL

儲存過程名和引數,引數中in表示傳入引數,out標示傳出引數,inout表示傳入傳出引數 create procedure p procedurecode in sumdate varchar 10 begin declare v sql varchar 500 需要執行的sql語句 declare...

寫MySQL儲存過程實現動態執行SQL

儲存過程名和引數,引數中in表示傳入引數,out標示傳出引數,inout表示傳入傳出引數 create procedure p procedurecode in sumdate varchar 10 begin declare v sql varchar 500 需要執行的sql語句 declare...