mysql---存儲過程

瞭解存儲過程之前,先了解一下mysql的控制結構。

類似C語言(if……else、while循環等)SQL也有自己的控制結構。


if……else控制結構:

例如:

(1)

if 判斷表達式 
   then 執行語句;
end if;

與c語言進行比較
if(判斷表達式)
   執行語句;

(2)

if 判斷表達式1 
   then 執行語句1;
else
   then  執行語句2;
end if;

與c語言進行比較
if(判斷表達式1)
   執行語句1;
else 
   執行語句2;

(3)

if 判斷表達式1 
   then 執行語句1;
elseif 判斷表達式2 
   then  執行語句2;
……
elseif 判斷表達式N 
   then 執行語句N;
else
   執行語句N+1;
end if;

與c語言進行比較
if(判斷表達式1)
   執行語句1;
else if(判斷表達式2)
   執行語句2;
……
else if(判斷表達式N)
   執行語句N;
else
   執行語句N+1;

需要注意所有的執行語句和end if都要以‘;’結束,而且判斷表達式之後接then,還有一點與C語言不同的是elseif之間沒有空格。

mysql中還有一些與if相關的函數

if(判斷表達式,值1,值2) 如果表達式爲“true”返回“值1”,表達式爲“false”返回“值2”。類似於C語言中的三目運算符。

ifnull(表達式1,表達式2)如果表達式1不爲空,則返回表達式1。如果表達式1爲空,則返回表達式2

nullif(表達式1,表達式2)如果表達式1=表達式2,返回null ,否則返回表達式1。


case when控制結構:

有兩種形式

(1)

case 待判斷值 
when 值1 then 輸出1
when 值2 then 輸出2
……
when 值N then 輸出N
else 默認輸出 end;  #如果輸出時語句的話,最後的結尾要改成end case。輸出的是值則是end

同C語言的switch相比較
switch(待判斷值){
case 值1:輸出1
          break;
case 值2:輸出2
          break;
……
case 值N:輸出N
          break;
default:默認輸出
}

(2)

case
when 判斷表達式1 then 輸出1
when 判斷表達式2 then 輸出2
……
when 判斷表達式N then 輸出N
else 默認輸出 end case; #如果輸出時語句的話,最後的結尾要是end case。輸出的是值則是end。

while循環結構:

while 判斷表達式 do
循環體
end while;

C語言中的while循環
while(判斷表達式){
循環體;
}

loop循環結構:無條件循環

標籤:loop
循環體;
end loop;
可以通過"leave 標籤"來跳出loop循環。

repeat循環結構:

repeat
循環體; 
until 判斷表達式 end repeat;


現在開始介紹存儲過程,其實存儲過程跟函數很像

查看當前存儲過程的狀態:show procedure status;

創建存儲過程:

create procedure 名稱(參數列表)
begin
語句集
end;

參數列表總是存在的,如果沒有參數則應該是空參數列表(),參數必須指定數據類型而且每個參數默認都是一個in參數。要指定爲其他參數,可以在參數前面加上out或inout關鍵字。默認的in類似於按值傳遞,在存儲過程中對參數進行修改,調用者是看不到的。out參數只是用來從存儲過程傳回數據的,無論給參數傳入什麼值,這個參數的初始值始終是null。對於inout參數,調用者不僅可以設置參數的初始值,而且在過程中修改參數,調用者是看得到的類似與按地址傳遞

刪除存儲過程:drop procedure 名稱;

查看存儲過程:show create procedure 名稱\G 類似於show create table 表名  \G的作用是橫向顯示

調用存儲過程:call 名稱(參數);

聲明變量:

(1)declare變量名 變量類型 默認值;    聲明變量必須在開頭定義,如果沒有默認值,初始值爲null。作用範圍是在begin……end內

(2)set @變量名=初始值;定義的變量是用戶變量,在存儲過程之外的sql也是可以調用的

變量賦值:set 變量名=變量值  切忌直接給變量賦值(變量名= 變量值)

還有一種給一個或多個變量賦值的方法:利用“select 指定列 into 指定變量”,所以select的結果必須是單行。

 

示例:

所有示例,都實現將分界符設置爲'$'

delimiter $

1、測試if-else控制結構



2、測試case……when

第一種情況:

輸出是值,結尾用end。一般用於select


輸出是語句,結尾用end case。一般用於存儲過程


第二種情況:

輸出是語句,結尾用end case。一般用於存儲過程


輸出是值,結尾用end。一般用於select


3、測試while循環



4、測試loop



5、測試repeat



6、帶參數的存儲過程

默認爲in的參數:按值傳遞

初始值爲0的變量tmp作爲參數傳入存儲過程後,雖然在存儲過程內對其進行修改,但調用者再次查看tmp時,值仍然爲0,沒有變化


out參數:


由第一個select可以看出,out參數不允許將實參的值傳入存儲過程。通過第二個和第三個select可以看出,存儲過程內部修改變量後可以返回給調用者。

與按地址傳遞還有所不同,out只允許返回值,不允許傳入值。


inout參數:按地址傳遞,形參值改變會改變實參的值


第一個select結果爲0,說明實參的值傳進存儲過程。第二個和第三個select結果表明,inout可以在存儲過程內部修改形參的值,從而影響實參,類似於按地址傳遞

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章