MySQL數據庫——存儲和函數
一、存儲過程
1 基本語法
CREATE PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
格式[IN|OUT|INOUT]param_name type
2. IN、OUT、INOUT參數
(1)帶IN的存儲過程
1 #創建儲存過程.cmd 中運行 2 CREATE PROCEDURE SP_SEARCH(IN p_name CHAR(20)) 3 BEGIN 4 IF p_name is null or p_name=‘‘ THEN 5 SELECT * FROMstudent; 6 ELSE 7 SELECT * FROM student WHERE sname LIKE p_name; 8 END IF; 9 END 10 #調用並輸出結果 11 call sp_search(‘張平‘); 12 DROP PROCEDURE SP_SEARCH;
(2)帶OUT的存儲過程
1 #帶OUT返回的 2 CREATE PROCEDURE SP_SEARCH2(IN p_name CHAR(20),OUT p_int INT) 3 BEGIN 4 IF p_name is null or p_name=‘‘ THEN 5 SELECT* FROM t_user; 6 ELSE 7 SELECT * FROM t_user WHERE USER_NAME LIKE p_name; 8 END IF; 9 SELECT FOUND_ROWS() INTO p_int; 10 END 11 #調用並輸出結果 12 CALL SP_SEARCH2(‘王%‘,@p_num); 13 SELECT @p_num;
(3)帶INOUT的存儲過程
1 #帶INOUT的存儲過程 2 CREATE PROCEDURE sp_inout(INOUT p_num INT) 3 BEGIN 4 SET p_num=p_num*10; 5 END 6 #調用並輸出結果 7 SET @p_num=2; 8 call sp_inout(@p_num); 9 SELECT @p_num;
3.存儲過程體
(1) 局部變量
在存儲過程體中可以聲明局部變量,用來存儲存儲過程體中臨時結果。
DECLARE var_name[,…] type [DEFAULT value]
Var_name:指定局部變量的名稱
Type:用於聲明局部變量的數據類型
default子句:用於為局部變量指定一個默認值。若沒有指定,默認為null.
如:Declare cid int(10);
使用說明:
局部變量只能在存儲過程體的begin…end語句塊中聲明。
局部變量必須在存儲過程體的開頭處聲明。
局部變量的作用範圍僅限於聲明它的begin..end語句塊,其他語句塊中的語句不可以使用它。
局部變量不同於用戶變量,兩者區別:局部變量聲明時,[email protected],並且它只能在begin..end語句塊中使用;而用戶變量在聲明時,[email protected],同時已聲明的用戶變量存在於整個會話之中。
(2) set語句
使用set語句為局部變量賦值
Set var_name=expr
Set cid=910;
(3) select … into 語句
把選定列的值直接存儲到局部變量中,語法格式
Select col_name[,…] into var_name[,…] table_expr
Col_name:用於指定列名
Var_name:用於指定要賦值的變量名
Table_expr:表示select語句中的from字句及後面的語法部分
說明:存儲過程體中的select…into語句返回的結果集只能有一行數據。
(4) 定義處理程序
是事先定義程序執行過程中可能遇到的問題。並且可以在處理程序中定義解決這些問題的辦法。這種方式可以提前預測可能出現的問題,並提出解決方法。
DECLARE handler_type HANDLER FOR condition_value[,…] sp_statement
handler_type:CONTINUE | EXIT | UNDO
Condition_value:Sqlwarning | not found | sqlexception
4.流程控制語句
(1)條件判斷語句
If語句
If search_condition then statement_list
[elseif search_condition then statement_list]…
[else statement_list]
End if
Search_condition參數:條件判斷語句
Statement_list參數:不同條件的執行語句
多重IF的存儲過程實例
1 #帶多重IF的存儲過程 2 CREATE PROCEDURE SP_SGRADE_LEVEL(IN p_level char(1)) 3 BEGIN 4 IF p_level =‘A‘ THEN 5 SELECT * FROM sc WHERE grade >=90; 6 ELSEIF p_level =‘B‘ THEN 7 SELECT * FROM sc WHERE grade <90 AND grade>=80; 8 ELSEIF p_level =‘C‘ THEN 9 SELECT * FROM sc WHERE grade <80 AND grade>=70; 10 ELSEIF p_level =‘D‘ THEN 11 SELECT * FROM sc WHERE grade <60; 12 ELSE 13 SELECT * FROM sc; 14 END IF; 15 END
Case 語句
表達形式1
Case case_value
When when_value then statement_list
[When when_value then statement_list]…
[else statement_list]
End case
表達形式2
Case
When search_condition then statement_list
End case
1 CREATE PROCEDURE SP_SGRADE_LEVEL1(IN p_level char(1)) 2 BEGIN 3 DECLARE p_num int DEFAULT 0; 4 CASE p_level 5 WHEN ‘A‘ THEN 6 SET p_num=90; 7 WHEN ‘B‘ THEN 8 SET p_num=80; 9 WHEN ‘C‘ THEN 10 SET p_num=70; 11 WHEN ‘D‘ THEN 12 SET p_num=60; 13 ELSE 14 SET p_num=0; 15 END CASE; 16 SELECT * FROM sc , student s WHERE sc.sno=s.sno 17 AND sc.grade >= p_num AND sc.grade< p_num+10; 18 END
Repeat語句語法格式
[begin_label:]
repeat
Statement_list
Until search_condition
End repeat
[end_label]
Repeat語句首先執行statement_list中的語句,然後判斷條件search_condition是否為真,倘若為真,則結束循環,若不為真,繼續循環。
Repeat先執行後判斷,while先判斷後執行。
使用範例:
1 #帶repeat的存儲過程 2 CREATE PROCEDURE sp_cal2(IN p_num INT,OUT p_result INT) 3 BEGIN 4 SET p_result=1; 5 REPEAT 6 SET p_result = p_num * p_result; 7 SET p_num = p_num-1; 8 UNTIL p_num<=1 9 END REPEAT; 10 END
5.調用存儲過程
Call sp_name([parameter[,…]]);
Sp_name被調用存儲過程的名稱
Parameter:指定調用存儲過程所要使用的參數。
6.修改存儲過程
代碼如下:
Alter procedure proc_name[characteristic…]
只能修改存儲過程的特征,如果要修改存儲過程的內容,可以先刪除該存儲過程,然後再重新創建
7.刪除存儲過程
代碼如下:
Drop procedure [if exists] sp_name;
二、函數
1. 定義
MySQL中,創建存儲函數的基本形式如下:
CREATE FUNCTION sp_name([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
Return
調用存儲函數
Select sp_name([func_parameter…])
Select fn_search(2);
2.存儲過程和函數區別
1)一般來說,存儲過程實現的功能要復雜一點,而函數的實現的功能針對性比較強。存儲過程,功能強大,可以執行包括修改表等一系列數據庫操作;用戶定義函數不能用於執行一組修改全局數據庫狀態的操作。
2)對於存儲過程來說可以返回參數,如記錄集,而函數只能返回值或者表對象。函數只能返回一個變量;而存儲過程可以返回多個。存儲過程的參數可以有IN,OUT,INOUT三種類型,而函數只能有IN類~~存儲過程聲明時不需要返回類型,而函數聲明時需要描述返回類型,且函數體中必須包含一個有效的RETURN語句。
3)存儲過程,可以使用非確定函數,不允許在用戶定義函數主體中內置非確定函數。
4)存儲過程一般是作為一個獨立的部分來執行( EXECUTE 語句執行),而函數可以作為查詢語句的一個部分來調用(SELECT調用),由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。 SQL語句中不可用存儲過程,而可以使用函數。
三、遊標(光標)
1.定義
查詢語句可能查詢出多條記錄,在存儲過程和函數中
使用遊標來逐條讀取查詢結果集中的記錄。
遊標的使用包括聲明遊標、打開遊標、使用遊標和關閉遊標。
遊標必須聲明遊標、打開遊標、使用遊標和關閉遊標。
遊標必須聲明在處理程序之前,並且聲明在變量和條件之後。
2.聲明遊標
Declare cursor_name cursor for select_statement;
Cursor_name:遊標名稱
Select_statement:select語句的內容
Declare cur_sc cursor for select sno,cno,grade from sc;
3.打開遊標
Open cursor_name
Open cur_sc;
4.使用遊標
Mysql中使用fetch關鍵字來使用遊標,語法形式
Fetch cur_name into var_name[,var_name…];
Cur_name表示遊標的名稱
Var_name表示將遊標中的select語句查詢出來的信息存入該參數。Var_name必須在聲明遊標前就定義好。
Fetch cur_sc into sc_sno,sc_cno,sc_grade;
5.關閉遊標
Close cursor_name;
Close cur_employee;
每個遊標不再需要時都應該被關閉,
使用close語句將會釋放遊標所使用的全部資源。
在一個遊標被關閉後,如果沒有重新被打開,則不能被使用。
對於聲明過的遊標,則不需要再次聲明,可直接使用open語句打開。
MySQL數據庫——存儲和函數