MySQL編程(自定義變量、存儲過程、條件控制、游標)


1.用戶自定義變量

1.1 用戶會話變量

MySQL用戶會話變量以一個”@“開頭,並且大小寫不敏感。一般情況下,用戶會話變量的定義和賦值會同時進行。使用set命令和select語句,可以對用戶會話變量進行定義和賦值。

(1)使用set命令定義用戶會話變量

語法:set @user_variable1=expression1 [,@user_variable2=expression2,...]

說明:user_variable1、user_variable2為用戶會話變量名;expression1、expression2可以是常量、變量和表達式;set命令可以同時定義多個變量,中間用逗號隔開即可。

 

 

 (2)使用select語句定義用戶會話變量

語法:第一種:select @user_variable1:=expression [,@user_variable2:=expression2,...];第二種:select expression1 into @user_variable1, expression2 into @user_variable2,...;

說明:第一種語法格式與第二種語法格式的區別在於,第一種語法格式中的select語句會產生結果集,第二種語法格式中的select語句僅用於會話變量的定義及賦值。

1.2 用戶會話變量賦值

檢索數據時,如果select語句的結果集是單個值,可以將select語句的返回結果賦予用戶會話變量。

1.3 重置命令結束標記

begin-end語句塊中通常存在多條MySQL表達式,每條MySQL表達式都使用”;“作為結束標記。在MySQL客戶機上輸入MySQL命令或SQL語句時,默認情況下MySQL客戶機也是使用”;“作為MySQL命令的結束標記。由於begin-end語句塊中的多條MySQL表達式密不可分,為了避免這些MySQL表達式被拆開,需要重置MySQL客戶機的命令結束標記,亦稱為命令分隔符(delimiter)。

 

 

 

2.存儲過程

2.1 局部變量

局部變量(local variable)必須定義在存儲程序中,如函數、存儲過程、觸發器以及事件中,而且局部變量的作用范圍僅局限於存儲程序中。如果脫離存儲程序,局部變量將沒有絲毫意義,定義局部變量的語法如下:declare 局部變量 數據類型;

局部變量主要應用於以下3種場合:

(1)場合1:局部變量定義在存儲程序的begin-end語句塊之間時,局部變量必須先進行declare命令定義,並且必須指定其數據類型。只有定義局部變量后,才可以使用set命令或select語句為其賦值。

(2)場合2:局部變量作為存儲過程或函數的參數使用時,雖然不需要使用declare命令定義,但需要指定參數的數據類型。

(3)場合3:局部變量也可以用於存儲程序的SQL語句中。數據檢索時,如果select語句的結果集是單個值,則可以將select語句的返回結果賦予局部變量。局部變量也可以嵌入到select語句、insert語句、update語句以及delete語句的表達式中。

2.2 存儲過程介紹

2.2.1 存儲過程的定義和特點

SQL語句的執行過程遵循“先編譯再執行”原則,而存儲過程(Stored Procedure)完美地體現了這一原則。存儲過程是一組為了完成特定功能的SQL語句集,經編譯后存儲在數據庫中。用戶通過指定存儲過程的名字並給定參數(如果該存儲過程帶有參數)來調用執行它。

一個存儲過程其實就是一個可編程的函數(函數有返回值,存儲過程沒有返回值),它在數據庫中創建並保存,並有SQL語句和一些特殊的控制結構所組成。當希望在不同的應用程序或平台上執行相同的功能,或者封裝特定的功能時,使用存儲過程是非常實用的解決之道。

2.2.2 存儲過程的優點

存儲過程的優點主要包括以下5點:

(1)存儲過程增強了SQL語言的功能性和靈活性。它可以用流程控制語句編寫,有很強的靈活性,可以完成復雜的判斷和較復雜的運算。

(2)存儲過程被創建后,可以在程序中被多次調用,而不必重新編寫該存儲過程的SQL語句。而且數據庫專業人員可以隨時對存儲過程進行修改,而對應用程序源代碼毫無影響。

(3)存儲過程能實現較快的執行速度。如果某一個操作包含大量的SQL代碼或分別被多次執行,那么存儲過程要比批處理的執行速度快很多,因為存儲過程是預編譯的。

(4)存儲過程能減少網絡流量。針對同一個數據庫對象的操作,如果這一操作所涉及的SQL語句被組織成存儲過程,那么當在客戶計算機上調用該存儲過程時,網絡中傳送的只是該存儲過程的調用語句,而不是大量的SQL語句,從而大大減少了網絡流量,降低了網絡負載。

(5)存儲過程還可以被作為一種安全機制來充分利用。系統管理員通過執行某一存儲過程的權限限制邏輯,能夠實現對相應數據的訪問權限的控制,從而避免了非授權用戶對數據的訪問,保證了數據的安全。

2.3 創建和執行存儲過程的語法

創建存儲過程時,數據庫開發人員需提供存儲過程名、存儲過程的參數以及存儲過程語句塊等信息,格式如下:

create proceduire 存儲過程名字(

  [in | out | inout] 參數1 數據類型1,

  [in | out | inout] 參數2 數據類型2,,

  ...

)

[no sql | reads sql data | modifies sql data]

begin

  存儲過程語句塊;

end;

語法說明如下:

(1)存儲過程的參數是局部變量。

(2)in代表輸入參數(默認為in參數),表示該參數的值必須由調用程序指定。

(3)out代表輸出參數,表示經過存儲過程的計算后,將out參數的計算結果返回給調用程序。

(4)inout代表既是輸入參數又是輸出參數,表示該參數的值即可以由調用程序指定,又可以將該參數的計算結果返回給調用程序。

執行存儲過程的語法格式如下:call 存儲過程名(參數列表)

 

3.條件控制語句

MySQL提供了簡單的流程控制語句,其中包括條件控制語句以及循環語句。這些流程控制語句通常放在begin-end語句塊中使用。條件控制語句分為兩種:一種是if語句,另一種是case語句。

3.1 if語句

if語句根據條件表達式的值確定執行不同的語句塊,語法格式如下:

if  條件表達式1 then 語句塊1;

[elseif  條件表達式2 then 語句塊2] ...

[else 語句塊n]

end if;

3.2 case語句

case語句用於實現比if語句分支更為復雜的條件判斷,語法格式如下:

case

  when 表達式1 then 語句塊1

  when 表達式2 then 語句塊2

  ...

  else 語句塊n

end;

3.3 while語句

當條件表達式的值為true時,反復執行循環體,直到條件表達式的值為false,while語句的語法格式如下:

[循環標簽:] while條件表達式 do

  循環體;

end while[循環標簽];

3.4 leave語句

leave語句用於跳出當前的循環語句,相當於高級編程語言的break語句。leave語句的語法格式如下:leave 循環標簽;

3.5 iterate語句

iterate語句用於跳出本次循環,進而進行下次循環,它的作用等同於高級編程語言重點continue語句,iterate語句的語法格式如下:iterate 循環標簽;

 

4.游標

4.1 游標介紹

數據庫開發人員在編寫存儲過程的給你存儲程序時,有時需要使用存儲程序中的SQL代碼掃描select結果集中的數據,並要求對該結果集中的每條記錄進行一些簡單的處理。游標本質上是一種能從select結果集重每次提取一條記錄的機制。

4.2 MySQL中使用游標的步驟

游標的使用可以概括為聲明游標、打開游標、從游標中提取數據和關閉游標4個步驟。

(1)聲明游標

語法:declare 游標名 cursor for select語句;

(2)打開游標

語法:open 游標名;

(3)從游標中提取數據

語法:fetch 游標名 into 變量名1,變量名2,...;

(4)關閉游標

語法:close 游標名;

4.3 游標的使用

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM