**目錄**
[TOC=2]
## 1 宣告與使用變數(shù)
在Stored routines中,除了可以宣告需要的參數(shù)外,如果需要處理比較復(fù)雜的資料,你也可以宣告「區(qū)域變數(shù)、local variables」。下列是宣告區(qū)域變數(shù)的語(yǔ)法與位置:

下列是幾種宣告區(qū)域變數(shù)的范例:

宣告需要的區(qū)域變數(shù)后,你就可以在stored routines中使用它們,需要指定變數(shù)值的話,可以使用下列兩種語(yǔ)法:

下列是宣告與使用「SET」敘述指定變數(shù)的范例:

下列的范例使用「SELECT」敘述,把查詢敘述回傳的資料指定給變數(shù):

在Stored routines中宣告區(qū)域變數(shù),一定要放在「BEGIN」與「END」區(qū)塊中:

在一個(gè)Stored routines中,除了基本的「BEGIN」與「END」區(qū)塊,也可以再使用「BEGIN」與「END」設(shè)定一個(gè)區(qū)塊,每一個(gè)區(qū)塊都可以宣告需要的區(qū)域變數(shù):

在「BEGIN」與「END」區(qū)塊中宣告的區(qū)域變數(shù),只有在宣告的區(qū)塊中有效,這也是它稱為區(qū)域變數(shù)的原因:

如果你使用一個(gè)已經(jīng)被清除的區(qū)域變數(shù),在建立stored routines時(shí)不會(huì)有問(wèn)題,不過(guò)使用的時(shí)候就會(huì)發(fā)生錯(cuò)誤:

在同一個(gè)區(qū)塊宣告變數(shù)時(shí),不可以使用同樣的變數(shù)名稱;不過(guò)你可以在內(nèi)層區(qū)塊中,使用外層區(qū)塊已經(jīng)使用過(guò)的變數(shù)名稱,可是要特別注意它們的有效范圍:

注:在撰寫stored routines時(shí),如果在多個(gè)區(qū)塊中宣告變數(shù),應(yīng)該還是使用不同的變數(shù)名稱會(huì)好一些。
## 2 判斷
建立與使用stored routines可以幫你一次執(zhí)行許多敘述,簡(jiǎn)化資料庫(kù)的操作;除了這個(gè)好處外,stored routines還提供許多判斷的語(yǔ)法,讓你可以執(zhí)行需要的判斷,再根據(jù)判斷的結(jié)果執(zhí)行不同的工作。
### 2.1 IF
MySQL在stored routines中提供「IF」敘述,你可以在「IF」敘述中設(shè)定判斷的條件,與條件成立時(shí)要執(zhí)行的工作。下列是「IF」敘述的語(yǔ)法:

下列的procedure范例接收一個(gè)表示體重的整數(shù)參數(shù),它會(huì)使用這個(gè)參數(shù)來(lái)判斷體重是否太重,如果超過(guò)100公斤的話,就會(huì)顯示「You are heavy!」:

呼叫上列的「test_weight」procedure范例會(huì)有下列的結(jié)果:

如果你希望體重超過(guò)100公斤時(shí),顯示「You are heavy!」,體重沒(méi)有超過(guò)100公斤時(shí),顯示「Good!」。這樣的需求可以在「IF」敘述中使用「ELSEIF」判斷其它需要的條件:

呼叫上列的「test_weight2」procedure范例會(huì)有下列的結(jié)果:

你可以依照需求在「IF」敘述中使用多個(gè)「ELSEIF」來(lái)判斷不同的條件,也可以使用一個(gè)「ELSE」來(lái)處理所有條件都不成立時(shí)要執(zhí)行的工作:

呼叫上列的「test_weight3」procedure范例會(huì)有下列的結(jié)果:

標(biāo)準(zhǔn)體重會(huì)依照身高與性別而不同,所以會(huì)有類似下列這樣的表格:
| 身高范圍 | 性別 | 標(biāo)準(zhǔn)體重 |
| --- | --- | --- |
| 160~164 | 男 | 58 |
| 165~169 | 男 | 60 |?
女 |56 |?
| 170~174 | 男 | 64 |?
女 |60 |
下列是一個(gè)依照上列表格所完成的標(biāo)準(zhǔn)體重函式:

完成可以傳回標(biāo)準(zhǔn)體重的「std_weight」函式以后,就可以用在下列這個(gè)判斷體重的procedure中:

### 2.2 CASE
在stored routines中還可以使用「CASE」敘述執(zhí)行條件判斷的工作。「CASE」敘述有兩種語(yǔ)法,第一種語(yǔ)法跟「IF」敘述是很類似的:

以判斷體重的需求來(lái)說(shuō),使用「CASE」敘述同樣可以完成:

「CASE」敘述還可以使用下列這種語(yǔ)法:

這樣的語(yǔ)法很適合使用在類似「ENUM」資料型態(tài)的判斷,例如下列這個(gè)判斷季節(jié)的procedure:

使用這種「CASE」語(yǔ)法來(lái)執(zhí)行判斷工作時(shí),要特別注意錯(cuò)誤資料的處理:

你應(yīng)該加入「ELSE」來(lái)預(yù)防錯(cuò)誤資料造成的問(wèn)題:

## 3 回圈
在stored routines中如果需要執(zhí)行一個(gè)工作多次的時(shí)候,就可以使用「回圈、loops」,搭配使用判斷與回圈,把一些固定又繁復(fù)的工作撰寫成stored routines儲(chǔ)存起來(lái),可以大幅度簡(jiǎn)化資料庫(kù)的操作。
### 3.1 WHILE
下列是可以用來(lái)執(zhí)行一個(gè)工作多次的「WHILE」回圈語(yǔ)法:

你必須依照需求設(shè)定「WHILE」回圈語(yǔ)法中的判斷條件,由它來(lái)控制回圈是否繼續(xù)執(zhí)行:

下列的「summary_while」范例可以為你從1開始加總到參數(shù)指定的數(shù)字:

### 3.2 REPEAT
下列是可以用來(lái)執(zhí)行一個(gè)工作多次的「REPEAT」回圈語(yǔ)法:

你必須依照需求在「REPEAT」回圈語(yǔ)法中的「UNTIL」設(shè)定判斷條件,由它來(lái)控制回圈是否繼續(xù)執(zhí)行:

下列的「summary_repeat」范例可以為你從1開始加總到參數(shù)指定的數(shù)字:

### 3.3 LOOP
下列是可以用來(lái)執(zhí)行一個(gè)工作多次的「LOOP」回圈語(yǔ)法:

如果只是單純的使用「LOOP」回圈的話,只要進(jìn)入回圈后,就會(huì)不斷重復(fù)執(zhí)行回圈中的敘述,永遠(yuǎn)不會(huì)停止:

## 4 標(biāo)簽
在使用「BEGIN-END」、「WHILE」、「REPEAT」與「LOOP」四種區(qū)塊時(shí),都可以為它們?cè)O(shè)定「標(biāo)簽、label」:

標(biāo)簽是由你自己為這些區(qū)塊取的名字,下列使用「LOOP」回圈來(lái)說(shuō)明標(biāo)簽的設(shè)定規(guī)則,這個(gè)規(guī)則同樣適用在其它三種區(qū)塊:

在一般的狀況下,通常不需要為區(qū)塊設(shè)定標(biāo)簽。如果為了控制sotred routines的執(zhí)行流程,才會(huì)設(shè)定區(qū)塊的標(biāo)簽。設(shè)定標(biāo)簽以后,就可以搭配使用「LEAVE」敘述來(lái)控制流程,下列是「LEAVE」敘述在「LOOP」回圈中的效果:

「LEAVE」敘述在其它三種區(qū)塊中有同樣的效果:

搭配使用「LEAVE」敘述來(lái)控制流程,就可以控制「LOOP」回圈在需要的時(shí)候離開。下列的「summary_loop」范例可以為你從1開始加總到參數(shù)指定的數(shù)字:

設(shè)定標(biāo)簽以后,也可以搭配使用「ITERATE」敘述來(lái)控制流程,下列是「ITERATE」敘述在「LOOP」回圈中的效果:

「ITERATE」敘述不可以使用在「BEGIN-END」區(qū)塊中,不過(guò)它在其它兩種區(qū)塊中有同樣的效果:

下列的「summary_iterate」范例可以為你從1開始加總到參數(shù)指定的數(shù)字,不過(guò)額外使用「ITERATE」敘述控制,讓這個(gè)function只會(huì)加總奇數(shù):

- (1) 重新開始
- (2) 數(shù)據(jù)庫(kù)概論和 MySQL 安裝
- (3) SELECT 基礎(chǔ)查詢
- (4) 運(yùn)算式和函數(shù)
- (5) JOIN 和 UNION 查詢
- (6) CRUD 和資料維護(hù)
- (7) 字符集和數(shù)據(jù)庫(kù)
- (8) 存儲(chǔ)引擎和數(shù)據(jù)類型
- (9) 表格和索引
- (10) 子查詢
- (11) 視圖
- (12) 預(yù)處理語(yǔ)句
- (13) 存儲(chǔ)過(guò)程入門
- (14) 存儲(chǔ)過(guò)程的變量和流程
- (15) 存儲(chǔ)過(guò)程進(jìn)階
- (16) 觸發(fā)器
- (17) 資料庫(kù)資訊
- (18) 錯(cuò)誤處理和查詢
- (19) 導(dǎo)入和導(dǎo)出數(shù)據(jù)
- (20) 性能
