使用場景:因為資料庫單錶增量較大,考慮將該錶水平拆分,分成32張表,路由欄位為使用者id,按照使用者id%32將資料散落到各個分表中,中介軟體採用sharding-sphere。表拆分完成以後,遇到尷尬的問題,生成相同結構的表,所以此處採用了儲存過程輔助生成表。
根據現有表結構建立表
create table $ like $;
儲存過程:
儲存過程將一段通用的操作封裝在一起,這樣在不同平台都可以通用了。
儲存過程沒有返回值,而且沒有sql語句呼叫,只能是call 呼叫,而且不返回結果集,執行就執行了。
-- 建立建表儲存過程
delimiter // #定義識別符號為雙斜槓
drop procedure if exists 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//
表示該引數的值必須在呼叫儲存過程時指定,在儲存過程中修改該引數的值不能被返回,為預設值
僅需要將資料傳入儲存過程,並不需要返回計算後的該值。
只能當做傳入引數
該值可在儲存過程內部被改變,並可返回
不接受外部傳入的資料,僅返回計算之後的值。
只能當做轉出引數
呼叫時指定,並且可被改變和返回
需要資料傳入儲存過程經過呼叫計算後,再傳出返回值
可當做傳入轉出引數
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釋放執行儲存過程中使用的資料庫資源。 MySQL儲存過程 簡單使用
先說一下儲存過程 解釋搬運 sql語句需要先編譯然後執行,而儲存過程 stored procedure 是一組為了完成特定功能的sql語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給定引數 如果該儲存過程帶有引數 來呼叫執行它。儲存過程是可程式設計的函式,在資料庫中建立並儲存,可以由...
mysql 儲存過程簡單使用
需要將乙個複雜的邏輯單元進行封裝,遮蔽使用者對細節關注 案例 因為資料庫單錶增量較大,考慮將該錶水平拆分,分成32張表,路由欄位為使用者id,按照使用者id 32將資料散落到各個分表中,中介軟體採用sharding sphere。表拆分完成以後,遇到尷尬的問題,生成相同結構的表,所以此處採用了儲存過...
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...