MySQL儲存過程和儲存函式

2022-09-16 00:27:14 字數 4628 閱讀 1269

儲存過程和儲存函式

mysql的儲存過程(stored procedure)和函式(stored function)統稱為stored routines。

1.儲存過程和函式的區別

函式只能通過return語句返回單個值或者表物件。而儲存過程不允許執行return,但是通過out引數返回多個值。 函式是可以嵌入在sql中使用的,可以在select中呼叫,而儲存過程不行。

函式限制比較多,比如不能用臨時表,只能用表變數.還有一些函式都不可用等等.而儲存過程的限制相對就比較少

一般來說,儲存過程實現的功能要複雜一點,而函式的實現的功能針對性比較強。

當儲存過程和函式被執行的時候,sql manager會到procedure cache中去取相應的查詢語句,如果在procedure cache裡沒有相應的查詢語句,sql manager就會對儲存過程和函式進行編譯。

procedure cache中儲存的是執行計畫 (execution plan) ,當編譯好之後就執行procedure cache中的execution plan,之後sql server會根據每個execution plan的實際情況來考慮是否要在cache中儲存這個plan,評判的標準乙個是這個execution plan可能被使用的頻率;其次是生成這個plan的代價,也就是編譯的耗時。儲存在cache中的plan在下次執行時就不用再編譯了。

2.建立儲存過程和函式例句(自己實際場景中使用的)

儲存過程

為了避免儲存sql中分號衝突,使用delimiter &&將mysql結束符設定為&&,最後用delimiter ;恢復回來

注意 delimiter &&和delimiter ;之間的空格,不能省略,否則不會生效

注意 最後的end使用&&結束

delimiter

&&create

procedure `history_order_user`(out history_order_count int, out history_order_user int, out pay_again_user_count int

)begin

select

count(*) into history_order_count from t_payment_reckoning where pay_status=

1;

select

count(distinct(openid)) into history_order_user from t_payment_reckoning where pay_status=1;

select

count(*) into pay_again_user_count from (select openid as mac from t_payment_reckoning where pay_status=

1group

by openid h**ing

count(openid)>

1order

bycount(openid) desc) as

table1;

end&&

delimiter ;

儲存函式

注意 最後的end使用&&結束

delimiter

&&create

function `record_auto_update`(dayindex varchar(4)) returns

varchar(11

) charset utf8 reads sql data deterministic

begin

set@dates

= date_add(curdate(), interval dayindex day

);set

@datee

= date_add(@dates, interval 1

day);

#獲取日期作為統計id

set@id

= date_format(@dates,'

%y%m%d');

#分別查詢4種支付型別訂單總數和訂單總額

select

count(*),sum(amount) into

@wapweixincount,@wapweixinamount

from t_payment_reckoning where payment_type="wapweixin" and paid_at>

@dates

and paid_at<

@datee

and pay_status=1;

select

count(*),sum(amount) into

@wapalipaycount,@wapalipayamount

from t_payment_reckoning where payment_type="wapalipay" and paid_at>

@dates

and paid_at<

@datee

and pay_status=1;

select

count(*),sum(amount) into

@pcweixincount,@pcweixinamount

from t_payment_reckoning where payment_type="pcweixin" and paid_at>

@dates

and paid_at<

@datee

and pay_status=1;

select

count(*),sum(amount) into

@pcalipaycount,@pcalipayamount

from t_payment_reckoning where payment_type="pcalipay" and paid_at>

@dates

and paid_at<

@datee

and pay_status=1;

#如果某種支付型別沒有訂單,會導致sum(amount)為空

if@wapweixinamount

isnull

then

set@wapweixinamount

=0; endif;

if@wapalipayamount

isnull

then

set@wapalipayamount

=0; endif;

if@pcweixinamount

isnull

then

set@pcweixinamount

=0; endif;

if@pcalipayamount

isnull

then

set@pcalipayamount

=0; endif;

#將4種支付型別累計

set@todaycount

=@wapweixincount

+@wapalipaycount

+@pcweixincount

+@pcalipaycount

;set

@todayamount

=@wapweixinamount

+@wapalipayamount

+@pcweixinamount

+@pcalipayamount

;#拼接4種型別的詳細資訊

set@todayinfo

=concat(

",'wapalipay

':,'

pcweixin

':,'

pcalipay

':}"

);#判斷是新增還是更新

select

count(*) into

@idexist

from t_payment_record where id=

@id;

if@idexist

>

0then

update t_payment_record set

count

=@todaycount,amount=

@todayamount,info=

@todayinfo,updated_at=

current_timestamp

where id=

@id;

return "update

";else

insert

into t_payment_record (id,count,amount,info,created_at,updated_at) value (@id,@todaycount,@todayamount,@todayinfo,current_timestamp,current_timestamp

);

return "insert

";endif;

end &&

delimiter ;

3.查詢儲存過程和函式的狀態,定義

show staus [like '名稱'];

show create  '名稱';

4.刪除儲存過程和函式

drop  '名稱';

Mysql 儲存過程和函式

一 儲存過程 procedure 本質上沒區別,執行的本質都一樣。只是函式有如 只能返回乙個變數的限制。而儲存過程可以返回多個。函式是可以嵌入在sql中使用的,可以在select中呼叫,而儲存過程要讓sql的query 可以執行,需要把 mysql real connect 的最後乙個引數設定為cl...

mysql儲存過程和函式

儲存過程是一系列sql語句集,具有靈活性,速度快,批處理 安全等特點 缺點 程式設計複雜 需要建立資料庫物件的許可權 掌握儲存過程的定義 檢視 修改 刪除 定義儲存過程 create procedure pro name parameter type characteristic routine b...

mysql儲存過程和函式

create precedure procedure name in param 1 int,out param 2,inout param 3 int begin end 1.不論有沒有引數都要加上括號.2.對自定義的變數使用set param value來賦值,使用select param來檢索...