MySQL的存儲過程全面解析
介紹
存儲過程是事先經過編譯并存儲在數(shù)據(jù)庫中的一段SQL語句的集合,調用存儲過程可以簡化應用開發(fā)人員的很多工作,減少數(shù)據(jù)在數(shù)據(jù)庫和應用服務器之間的傳輸,對于提高數(shù)據(jù)處理的效率是有好處的。 存儲過程思想上很簡單,就是數(shù)據(jù)庫SQL語言層面的代碼封裝與重用。
特點:
- 封裝,復用
- 可以接收參數(shù),也可以返回數(shù)據(jù)
- 減少網(wǎng)絡交互,效率提升
基本語法
創(chuàng)建
create procedure 存儲過程名稱([參數(shù)列表])
begin
--sql語句
end;調用
call 名稱([參數(shù)]);
查看
-- 查詢指定數(shù)據(jù)庫的存儲過程及狀態(tài)信息 select from information_schema.routines where routine_schema = 'xxx'; -- 查詢某個存儲過程的定義 show create procedure 存儲過程名稱;
刪除
drop procedure [if exists] 存儲過程名稱;
示例:
--定義一個數(shù)據(jù)庫名為‘itcast', 其中的一個表為 ‘student'
--創(chuàng)建
create procedure p1()
begin
select count(*) from student
end ;
--調用
call p1();
--查看
select * from information_schema.ROUTINES where ROUTINE_SCHMA = 'itcast';
show create procedure p1 ;
--刪除
drop procedure if exists p1;單詞:routine(常規(guī),習慣) schema(圖解,計劃,模式) procedure(步驟,程序)
注意:在命令行中,執(zhí)行創(chuàng)建存儲過程的SQL時,需要通過關鍵字delimiter指定SQL語句的結束符。例如 delimiter $$
變量
系統(tǒng)變量
系統(tǒng)變量是MySQL服務器提供,不是用戶定義的,屬于服務器層面。分為全局變量(GLOBAL)、會話變量(SESSION)。
- 查看系統(tǒng)變量
--查看所有系統(tǒng)變量 默認為session show [session | global] variables; --可以通過LIKE模糊匹配方式查找變量 show [session | global] variables like ''; --查看指定變量的值g select @@[session | global] 系統(tǒng)變量名 ;
- 設置系統(tǒng)變量
set [session | global] 系統(tǒng)變量名 = 值 ; set @@[session | global] 系統(tǒng)變量名 = 值 ;
用戶自定義變量
用戶定義變量是用戶根據(jù)需要自己定義的變量,用戶變量不用提前聲明,在用的時候直接用“@變量名”使用就可以。其作用域為當前 連接。
注意:用戶自定義變量為一個@,系統(tǒng)變量為兩個@,即@@
賦值
set @var_name = expr; --可以一次賦值多個 set @var_name := expr; select @var_name := expr; select 字段名 into @var_name from 表名;
使用
select @var_name;
示例:
set @myname = '李華' ; set @myage := 10; --推薦使用" := "的格式,是為了區(qū)分" = "的比較運算符,因為MySQL中沒有" == "賦值運算符 select @mycolor := 'red'; select count(*) into @mycount from test --將test表中的結果賦值給@mycount select @myname,@myage;
注意: 用戶定義的變量無需對其進行聲明或初始化,只不過獲取到的值為NULL,
局部變量
局部變量是根據(jù)需要定義的在局部生效的變量,訪問之前,需要DECLARE聲明??捎米鞔鎯^程內的局部變量和輸入?yún)?shù),局部變量 的范圍是在其內聲明的BEGIN...END塊。
- 聲明
- declare 變量名 變量類型[default ...] ;
- 變量的數(shù)據(jù)類型就是數(shù)據(jù)庫字段類型 : int , varchar, decimal , datetime等
- 賦值
- set 變量名 = 值 ;
- select 字段名 into 變量名 from 表名 ..;
示例:
create procedure p2()
begin
--聲明
declare num int default 0 ;
--將查詢結果賦值給num
select count(*) into num from text;
--查詢
select num;
end;
--查看
call p2();if判斷
語法:
if 條件1 then .... else if 條件2 then .... else .... end if ;
舉例:
根據(jù)定義的分數(shù)score變量,判定當前分數(shù)對應的分數(shù)等級。
1.score>=85分,等級為優(yōu)秀。
2.score>=60分且score<85分,等級為及格。
3.score<60分,等級為不及格
create procedure p3()
begin
declare score int default 58;
declare result varchar(10);
if score >= 85 then
set result := '優(yōu)秀';
else if result >= 60 then
set result := '及格' ;
else
set result := '不及格';
end if ;
select result;
end;參數(shù)

例子1:
根據(jù)傳入參數(shù)score,判定當前分數(shù)對應的分數(shù)等級,并返回
1.score>=85分,等級為優(yōu)秀。
2.score>=60分且score<85分,等級為及格。
3.score<60分,等級為不及格
create procedure p4(in score int, out result varchar(10))
begin
if score >= 85 then
set result := '優(yōu)秀';
else if result >= 60 then
set result := '及格' ;
else
set result := '不及格';
end if ;
end;
call(68,@result); --第二個變量為用戶自定義變量
select @result;例子2:將傳入的200分制的分數(shù),進行換算,換算成百分制,然后返回分數(shù)
create procedure p5(inout score double) begin set score := score * 0.5; end; set @score = 78; call p5(@score); select @score;
case

示例:
根據(jù)傳入的月份,判定月份所屬的季節(jié)(要求采用case結構)。 1.1-3月份,為第一季度
2.4-6月份,為第二季度
3.7-9月份,為第三季度
4.10-12月份,為第四季度
create procedure p6(in month int)
begin
declare result varchar(10) ;
case
when month >= 1 and month <=3 then
set result := '第一季度';
when month >= 4 and month <=6 then
set result := '第二季度';
when month >= 7 and month <=9 then
set result := '第三季度';
when month >= 10 and month <=12 then
set result := '第四季度';
else
set result := '非法參數(shù)';
end case;
select concat('您輸入的月份為:',month,'所屬的季度為:',result);
end;
call p6(7);循環(huán)while
while循環(huán)是有條件的循環(huán)控制語句。滿足條件后,再執(zhí)行循環(huán)體中的SQL語句。具體語法為:

示例:計算從1累加到n的值,n為傳入的參數(shù)值。
-- 實現(xiàn)思路
-- 定義局部變量,記錄累加之后的值
-- 每循環(huán)一次,會對n進行減1,如果n減到0,則退出循環(huán)
create procedure p7(in n int)
begin
declare total int default 0;
while n > 0 do
set total := total + n;
set n := n - 1;
end while
select total;
end;
call p7(10);到此這篇關于MySQL的存儲過程的文章就介紹到這了,更多相關mysql存儲過程內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySql?字符集不同導致?left?join?慢查詢的問題解決
當兩個表的字符集不一樣,在使用字符型字段進行表連接查詢時,就需要特別注意下查詢耗時是否符合預期,本文主要介紹了MySql?字符集不同導致?left?join?慢查詢的問題解決,感興趣的可以了解一下2024-05-05
mysql8.0.11安裝配置方法圖文教程 MySQL8.0新密碼認證方式
這篇文章主要為大家詳細介紹了mysql8.0.11安裝配置方法圖文教程,以及MySQL8.0新密碼認證方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-11-11

