mysql 儲存過程簡單使用

2022-06-14 18:30:12 字數 2587 閱讀 1259

需要將乙個複雜的邏輯單元進行封裝,遮蔽使用者對細節關注

案例:因為資料庫單錶增量較大,考慮將該錶水平拆分,分成32張表,路由欄位為使用者id,按照使用者id%32將資料散落到各個分表中,中介軟體採用sharding-sphere。表拆分完成以後,遇到尷尬的問題,生成相同結構的表,所以此處採用了儲存過程輔助生成表。

儲存過程將一段通用的操作封裝在一起,這樣在不同平台都可以通用了。

儲存過程沒有返回值,而且沒有sql語句呼叫,只能是call 呼叫,而且不返回結果集,執行就執行了。

1. 表示該引數的值必須在呼叫儲存過程時指定,在儲存過程中修改該引數的值不能被返回,為預設值

2. 僅需要將資料傳入儲存過程,並不需要返回計算後的該值。

3. 只能當做傳入引數

1. 該值可在儲存過程內部被改變,並可返回

2. 不接受外部傳入的資料,僅返回計算之後的值。

3. 只能當做轉出引數

1. 呼叫時指定,並且可被改變和返回

2. 需要資料傳入儲存過程經過呼叫計算後,再傳出返回值

3. 可當做傳入轉出引數

mysql儲存過程中declare 和set 定義變數的區別:

declare 變數名 資料型別

例如:

declare i int;

修改變數值:

set 變數名 =  值;

例如:

set i =

0;

使用set 或者select 直接賦值,變數名以@開頭

例如:

set

@temp

=1;

可以在會話的任何地方宣告,作用域是整個會話,稱為會話變數,也是全域性變數。

以declare關鍵字宣告的變數,只能在儲存過程中使用,稱為儲存過程變數。 這種變數需要設定變數型別,而且只存在begin....end  這段內

兩者區別:

在呼叫儲存過程時,declare宣告的變數都會別初始化為null,而會話變數(以@開頭的變數)則不會再被初始化,在乙個會話內只被初始化一次,之後是對上一次會話的計算結果,相當於這個會話的全域性變數。

執行計畫中,用select + 變數列印變數值。

call + 儲存過程

例如:

call copytable('

channel

','',5);

顯示所有儲存過程:

show procedure status;

刪除指定儲存過程:

drop

procedure 儲存過程名 ;

踩坑:mysql 儲存過程中不能把變數賦值到表名處,所以,採用預sql,將要執行的sql批出來,再去執行,最後通過deallocate釋放執行儲存過程中使用的資料庫資源。 

問題描述:將demo表分成demo0,demo1....,demo31共32張分表。

我們知道,根據現有表結構建立表對應sql

create

table $ like $;

根據上面複製表sql,我們將其轉為儲存過程:

--

建立建表儲存過程

delimiter //

#定義識別符號為雙斜槓

drop

procedure

ifexists

copytable;

create

procedure copytable(in copytablename varchar(250),in separatorname varchar(250),in cnums int

)

begin

declare i int

;

set i =

0;

repeat

set@temp :=

concat(copytablename,separatorname,i); #拼接臨時生成的表名

set@sqltemp := concat('

create table

',@temp,'

like

',copytablename); #拼接要執行的sql語句

prepare stmt from

@sqltemp

; #建立預sql

execute

stmt; #執行預sql

deallocate

prepare

stmt; #釋放執行中使用的所有資料庫資源

select concat(@temp,'

create success !

') as

msg ; #列印

set i = i +1;

until i

> cnums end

repeat;

end//

最後,我們呼叫儲存過程

call copytable('

demo

', '', 31);

MySQL儲存過程 簡單使用

先說一下儲存過程 解釋搬運 sql語句需要先編譯然後執行,而儲存過程 stored procedure 是一組為了完成特定功能的sql語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給定引數 如果該儲存過程帶有引數 來呼叫執行它。儲存過程是可程式設計的函式,在資料庫中建立並儲存,可以由...

mysql 儲存過程簡單使用

使用場景 因為資料庫單錶增量較大,考慮將該錶水平拆分,分成32張表,路由欄位為使用者id,按照使用者id 32將資料散落到各個分表中,中介軟體採用sharding sphere。表拆分完成以後,遇到尷尬的問題,生成相同結構的表,所以此處採用了儲存過程輔助生成表。根據現有表結構建立表 create t...

Mysql儲存過程使用

案例 create procedure sp insert graduate certificate in psid varchar 200 in certificateid int 32 in number varchar 50 in userid int 32 in starttime date...