--儲存過程名和引數,引數中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越權 MYSQL儲存過程的越權執行
老早就有人提出來過了,不是什麼新技術,寫在這裡當備忘而已。沒做過多的測試,有些東西也是按我自己的理解說的,有錯誤請指出。若使用比如 use test delimiter create procedure readf f varchar 100 begin select load file f end...