需要將乙個複雜的邏輯單元進行封裝,遮蔽使用者對細節關注
案例:因為資料庫單錶增量較大,考慮將該錶水平拆分,分成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;
刪除指定儲存過程:
dropprocedure 儲存過程名 ;
踩坑:mysql 儲存過程中不能把變數賦值到表名處,所以,採用預sql,將要執行的sql批出來,再去執行,最後通過deallocate釋放執行儲存過程中使用的資料庫資源。
問題描述:將demo表分成demo0,demo1....,demo31共32張分表。
我們知道,根據現有表結構建立表對應sql
createtable $ 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...