存儲過程和函數
一、創建存儲過程和函數
1、創建存儲過程
- 語法:
CREATE
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
- create procedure:存儲的關鍵字
- sp_name:存儲過程的名字
- proc_parameter:存儲過程的參數列表characteristic存儲過程的特性
- 格式:
- [ IN | OUT | INOUT ] param_name type
- 介紹:
- in----輸入,out----輸出,inout----可以輸入也可以輸出
- param_name:參數名稱
- type:參數的類型(MySQL的任意類型)
- 格式:
- routine_body sql的代碼
【例】
2、創建存儲函數
- 語法:
- create function 存儲函數的關鍵字
- sp_name存儲函數的名稱
- func_parameter存儲過程的參數列表type-----函數返回的數據類型
- 格式:
- [ IN | OUT | INOUT ] param_name type
- 介紹:
- in----輸入,out----輸出,inout----可以輸入也可以輸出
- param_name 參數名稱
- type 參數的類型(MySQL的任意類型)
- 格式:
- routine_body sql的代碼
- characteristic存儲過程的特性
【例】
mysql> delimiter //
mysql> create
-> function hangshu()
-> returns char(50)
-> return (select * from guke);
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
3、變量
- 介紹變量
變量可以在子程序中聲明並使用,這些變量的使用范圍是begin……end程序中
- 定義變量語法:
DECLARE var_name [, var_name] ... type [DEFAULT value]
- 介紹賦值變量語法:
- var_name 局部變量名稱
- type變量類型
- DEFAULT value給變量提供一個默認值,默認值可以是常數,也可以是表達式,系統默認為空值
SET var_name=expr[,var_name=expr]……;
注意:不同的變量類型(局域聲明變量及全局變量)可以被混合;
4、定義條件和處理程序
- 定義條件
- 語法:
DECLARE condition_name CONDITION FOR condition_value
condition_value:
SQLSTATE [VALUE] sqlstate_value| mysql_error_code
- 定義處理程序
5、光標的使用------光標只能在存儲過程和函數中使用
- 聲明光標
- 語法:declare 光標名 cursor for select語句內容
- 打開光標
- 語法:open 光標名
- 使用光標
- 語法:
- fetch cursor_name into var_name[,var_name]……{參數名稱}
- 說明
- cursor_name 光標名
- var_name 表示將光標中的select語句查詢出來的信息存入該參數中。
- 【注意】
- 必須在聲明光標之前就定義好
- 關閉光標
- 語法:
- close 光標名
- 【注意】
- 如果沒有被明確地關閉,光標在它被聲明的復合語句的末尾被關閉
6、流程控制的使用
- if語句
- 介紹:
- 包含多個條件判斷,根據判斷結果為true或false執行相應的語句,與Java語句類似
- 語法:
- 介紹:
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
- case語句
- 語法:
-
- 參數說明
- case_value 表示條件判斷的表達式,決定那個when語句執行
- when_value表示表達式可能的值,如果when_value與case_value相等,則執行在then后 面的statement_list語句;
- statement_list表示不同條件的執行語句,
- 參數說明
- loop語句
- 介紹:
- 循環語句重復執行語句
- 語法:
- 介紹:
-
- leave語句
- 介紹:
- 退出循環
- 語法:
- LEAVE label
- 參數說明:
- Label:退出循環的要求
- 介紹:
- iterate語句
- 介紹:
- 將執行順序轉到語句段開頭處
- 語法:
- ITERATE label
- 參數說明
- Label:開始循環的要求
- 注意:
- 只能用於LOOP、REPEAT和WHILE語句中
- 介紹:
- while語句
- 介紹:
- 帶條件判斷的循環過程,與repeat語句不同,先對指定的表達式進行判斷,如果符合, 則開始循環,否則退出循環;
- 語法:
- 參數說明
- begin_label:表示標注名稱
- search_condition條件表達式
二、調用存儲過程和函數
1、調用存儲過程
語法:
call 存儲過程名字([存儲過程的參數[,……]])
2、調用存儲函數
語法:
select 存儲函數名字([存儲過程的參數[,……]])
三、查看存儲過程和函數
1、使用show status語句查看存儲過程和函數的狀態
語法:
show {procedure|function}status[like’存儲過程或存儲函數的名稱’]
注意:
顯示:數據庫、名字、類型、創建者、創建和修改日期
2、使用show create語句查看存儲過程和函數的定義
語法:
show create{procedure|function}存儲過程或存儲函數的名稱
3、從information_schema.Routines表查看存儲過程和函數的信息
語法:
select * from information_schema.Routines
where routine_name=’存儲過程或存儲函數的名稱’;
四、修改存儲過程和函數
語法:
ALTER {procedure|function} 存儲過程或存儲函數的名稱 [characteristic ...]
characteristic:
COMMENT 'string'
| LANGUAGE SQL
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
五、刪除存儲過程和函數
語法:
DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name
