一:概念:
? ? ? ? 存儲過程實際上對標了JAVA當中的方法,兩者是相似的,同時需要注意的一點是,MYSQL僅僅在5.0版本之后才出現這種存儲操作的過程;
? ? ? ?
優點:
? ? ? ? 1.存儲過程能夠讓運行的速度變得更加迅速,僅僅只有首次進行實用的時候需要進行相應的編譯,之后再次調用的時候可以直接進行實用
? ? ? ? 2.存儲過程的特點:模塊化,代碼復用,封裝。
二:分類
1.存儲過程關鍵語句
2.變量
3.參數傳遞
4.分支語句
5.循環語句
6.游標
7.異常處理handler
1.存儲過程關鍵語句:
delimiter (設置啟動的標識符);
create procedure (存儲過程的名稱) (參數傳遞關鍵詞 參數名稱 參數類型);
begin(檢索代碼)
end (開始設置的標識符);
delimiter ;
2.變量:
1>變量類型:
①:局部變量
②:用戶變量
③:參數變量
2>變量介紹:
? ? ? ? ①:局部變量
? ? ? ? 范圍:顧名思義,局部變量的作用范圍比較的小,僅僅只能夠作用在存儲過程當中的begin--end之間進行實用,一旦超出范圍進行調用,檢索的時候就無法進行搜索:
? ? ? ? 關鍵語句:
delimiter ..;
create procedure ...()begindeclare (局部變量名稱) 局部變量的類型 [default ....(初始化)];
-- 開始對于局部變量進行賦值set (局部變量名稱) = ...;(其他檢索)
end ...;
delimiter ;select (局部變量名稱); -- 不成功,因為在存儲過程begin-end之外運行
? ? ? ? ②用戶變量:
? ? ? ? 范圍:用戶變量的作用范圍有所增大,可以作用于當前的會話,也就是作用在當前互聯網跟mysql的連接ing
? ? ? ? 關鍵語句:
TIPS:
-- 1.需要注意的一點是,對于所有的用戶變量,都不需要進行聲明,賦值即聲明
-- 2.對于所有的用戶變量,都能夠在存儲過程的外面進行調用delimiter ...;
create procedure ...()
begin set (用戶變量名稱) = ;
end ...;
delimiter ;select (用戶變量名稱); -- 可以搜索到相應的結果
? ? ? ? ③參數變量:
? ? ? ? 參數變量又可以分為兩個部分,一個是全局變量,一個是會話變量
? ? ? ? ? ? ? ? 1.全局變量:
? ? ? ? ? ? ? ? ? ? ? ? 1>范圍:
? ? ? ? ? ? ? ? ? ? ? ? 對于全局變量的修改會影響到一整個的服務器,并且對于全局變量來說,在MYSQL啟動的時候由服務器自動對他們進行默認初始化,這些默認值可以通過my.in這個文件進行修改
? ? ? ? ? ? ? ? ? ? ? ? 2>關鍵語句:
關鍵使用語句:global
1.查看全局變量:
select global variables(全局變量名稱);
2.查看具體的全局變量
show global@@.(相應的全局變量名稱);
3.修改全局變量的值
set global (全局變量名稱) = new_value;
? ? ? ? ? ? ? ? ? ? ? 2.會話變量:
? ? ? ? ? ? ? ? ? ? ? ? 1>作用范圍:
? ? ? ? ? ? ? ? ? ? ? ? 對于會話變量,會在每一次建立新的連接的時候,MYSQL會對其進行初始化,將全局變量的值賦值一份用來當作當前新建會話的會話變量
? ? ? ? ? ? ? ? ? ? ? ? 2>關鍵語句:
1.查看局部變量
select session variables;2.查看具體的局部變量
select @session.(局部變量名稱);3.修改局部變量的值
set session (局部變量名稱) =new_value;
????????TIPS: 其實兩個變量大體上是一樣的,僅僅只有在作用范圍上不同,其他的都是一樣。因此,如果兩個變量都沒有修改,那么全局變量跟用戶變量的值是一樣的,兩者并沒有區別;
三.參數傳遞:
? ? ? ? 1.類型:參數傳遞主要分為三個,包括有三個部分分別是in,out,inout
? ? ? ? 2.介紹:
? ? ? ? ? ? ? ? 操作:
in:讓數據能夠進入到存儲過程當中進行查詢
delimiter \\;
create procedure emp_1(in name varchar(20))
begin select * from emp e where e.name=name; -- 第二個name代表的是傳入的參數的名稱
end \\;
delimiter ;out:能夠讓參數進行返回使用
delimiter \\;
create procedure emp_2(in name varchar(20),out id int)
begin select e.id into id from emp e where e.name=name; -- 第二個name代表的是傳入的參數的名稱
end \\;
delimiter ;call emp_2(‘劉一’,@id);
select @id;inout:能夠對于輸入的值進行修改,之后再進行返回
delimiter \\;
create procedure emp_3(inout name varchar(20))
begin select * from emp e where e.name=name; -- 第二個name代表的是傳入的參數的名稱
end \\;
delimiter ;
set name='王老師';
call emp_3(name);
四:分支語句
? ? ? ? 1.分類:
? ? ? ? ?分支語句主要包括有幾個部分,if分支,case分支
? ? ? ? 2.
? ? ? ? ? ? ? ? ①:if分支
關鍵語句:
if (條件) then 查詢;
elseif (條件...) then查詢:
else default(設置除了這些之外的其他操作會有什么結果)
endif;delimiter \\;
create procedure pro-1(in single int)
begin
if single=1
-- 如果輸入數字為1那么就顯示所有的員工信息;then select * from emp;
eles select '錯誤選項';
endif;
end \\;
delimiter ;有關if的其他小知識:
leava 表示直接離開當前的條件判斷 -- 相當于JAVA當中的break;
iterate 表示的是跳過當前的判斷 -- 類似于在java當中的continue;
②case分支:
類似于JAVA當中的switch語句
語法一:
case case_value(變量名稱)when when_value then select語句when when_value then select語句[else default]
end case;語法二:
casewhen search_condition then select...when search_condition then select...[else default]
end case;
五:循環語句:
? ? ? ? 循環語句主要可以分為三大類:while , loop ,repeat
? ? ? ? 循環是一種雖然只會程序當中出現一次,但是能夠運行多次的代碼
1.while
while循環類似于JAVA當中的while的循環,都是先判斷條件,判斷正確之后,可以再執行之后的語句,否則結束循環語句:
while(condition_value) do
循環體
end while;加入到存儲過程當中:一:在表格當中插入數據,并且為自己控制插入多少條,設置use1存儲過程
create table emp1(
id int primary key,
name varchar(20),
user varchar(20)
);delimiter \\;
create procedure use1(in single int)
begin declare i int default 1;
while(i<=single) doinsert into emp1 values(i,concat('user',i),'123456');set i = i+1;
end while;二:在表格當中插入single_0條數據,但是跳過第single_1條數據,設置use2存儲過程
delimiter \\;
create procedure use2(in single_0 int,in single_1 int)
begindecalre i int default 1;
w while(i<=single_0) doa if(i = single_1) thenset i = i+1; iterate a;else insert into emp values(i,concat('user',i),'123456');set i = i+1;end if;
end while;
end \\;
delimiter ;
2.repeat循環語句
repeat循環相當于之前在java當中所學習的do-while循環,需要先執行查找語句,之后再進行判斷條件語句:
[標簽] repeat
循環體;
utile when_value;
end repeat[標簽];
3.loop循環
loop循環不需要條件的判斷,能夠一直進行執行,所以,如果需要跳過循環,那么就需要使用相應的if條件判斷,從而跳出這個死循環 -- 對應了java當中的while(true)循環語法:
[循環標簽] loop
循環體:
if when_value then....
elseif when_value then...
...leave [循環標簽];...
end if;
end loop;
六.游標
1.介紹
? ? ? ? 游標是一種能夠存儲查詢結果集的數據類型,在存儲過程當中可以使用光標對結果進行一定的循環處理
2.使用
? ? ? ? 光標的使用包括:光標的聲明,光標的打開,數值的獲取,光標的關閉
-- 聲明:
declare 游標名稱 cursor for select_statement
-- 打開語法
open 游標名稱
-- 取值語法
fetch 游標名稱 into decl_name.....
-- 關閉語法
close 游標名稱;
七.handler異常處理
1.介紹:
? ? ? ? 在MYSQL當中,針對一些錯誤機制進行處理的方法,通過HANDLER的使用,能夠在MYSQL查詢的過程當中避免一些錯誤類型的出現;
2.語法:
handler 異常處理聲明:declare (handler_action handler)for (condition_value) statement;handler_action:主要包括有三大部分
1.contitue 在錯誤出現之后繼續之后的查詢
2.exit 在錯誤出現之后不再進行之后的查詢,直接結束所有的查詢
3.UNDO不建議condition_value主要包括以下的幾個部分
mysql_error_code
condition_name
SQLWARNING
NOT FOUND 未查詢到相應的數據
SQLEXCEPTION SQL查詢錯誤同時的,如果需要使用handler句柄進行異常處理,首先需要考慮:
1.如果發現錯誤了,之后需要進行什么操作(condition_value)
2.這種錯誤是什么樣的錯誤類型condition_valueTIPS:需要注意的一點,對于各種聲明,順序是,變量聲明,游標聲明,handler聲明的順序