存儲過程就是一條或多條SQL語句的集合,可視為批文件,但作用不僅限於批處理,本文介紹如何創建存儲過程以及變量的使用,如何調用、查看等。
創建語法如下:
create procedure sp_name([proc_parameter]) (characteristics ...) routine_body
pro_parameter:參數列表,
列表形式:[in|out|inout] param_name type
characteristics:存儲過程的特性,有以下取值
language sql:說明toutine_body部分是由sql組成;
[not] deterministic:指明相同的輸入是否會得到相同的輸出,deterministic表示結果確定,not deterministic表示不確定,默認為not deterministic;
{contains sql | not sql | reads sql data | modifies sql data}:指明子程序使用sql的限制,其中contains sql指不包含讀寫數據的sql語句;not sql表示不包含sql語句;reads sql data說明子程序包含讀數據的語句;modifies sql data表明子程序包含寫數據的語句。默認contains sql。
sql security {definer | invoker}:指明誰有權限來執行,definer表示只有定義者才能執行,invoker 表示擁有權限的調用者可以執行,默認情況下為definer。
comment 'String':注釋信息,可以用來描述存儲過程。
routine_body:sql代碼內容,用Begin ... End來表示sql代碼的開始和結束。
舉個簡單的應用例子,有表為fruits存有單價、名稱等,創建存儲過程返回所有水果的評均價格,代碼如下:
create procedure AvgFruitPrice(out param1 int)
Begin
select avg(f_price) into param1 from fruits;
End;
變量的使用
1.定義變量,語法如下:
Delare var_name [,var_name] ... date_type[DEFAULT value];
var_name是局部變量名稱,DEFAULT value子句為變量提供初始值。
2.為變量賦值,語法格式如下:
Set var_name = expr1[,var_name = expr2] ...;
聲明三個變量,分別為var1,var2,var3,數據類型為int,使用set為變量賦值,代碼如下:
Declare var1, var2, var3 int;
Set var1=10, var2=20;
Set var3 = var1 + var2;
還可以通過select ... from為一個變量賦值:select col_name[, ...] into var_name[, ...] from table where...。
流程控制的使用
1.IF語句,語法格式如下:
IF expr_condition THEN statement_list
[ELSEIF expr_condition THEN statement_list]...
[ELSE statement_list]
END IF
2.case語句,語法格式如下:
CASE case_expr
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]...
[ELSE statement_list]
END CASE
3.LOOP語句(循環操作的過程),語法格式如下:
[loop_label:] LOOP
statement_list
END LOOP [loop_label]
4.LEAVE語句
LEAVE語句用來退出循環。
Delare id int default 0;
add_loop:LOOP
SET id = id + 1;
IF id >= 10 THEN LEAVE add_loop;
END IF;
END LOOP add_loop;
5.ITERATE 語句,語法形式:ITERATE label
該語句只能出現在循環內,意為“再次循環”。
6.REPEAT語句
該語句創建一個帶條件判斷的循環的過程,每次語句執行完畢,會對條件表達式進行判斷,如果表達式為真,則循環結束,否則重復循環,語法形式如下:
[repeat_label:] REPEAT
statement_list
UNTIL expr_condition
END REPEAT [repeat_label]
repeat_label為標注名稱(可省略),直至expr_condition條件為真,才會退出循環。
7.WHILE語句
該語句創建帶條件判斷的循環過程,與REPEAT語句不同,WHILE 執行語句時先對表達式進行判斷,如果為真則執行循環內語句,否則退出循環,語法形式如下:
[while_label:] WHILE expr_condition DO
statement_list
END WHILE [while_label]