MySQL資料庫存儲過程使用

1. 目標

掌握如何創建存儲過程

2. 語法

CREATE PROCEDURE sp_name([proc_parameter])

[characteristics…] routine_body

3. 說明

CREATE PROCEDURE為用來創建存儲過程的關鍵字; sp_name為存儲過程的名稱; proc_parameter為指定存儲過程的參數列表,參數列表的形式:[IN | OUT | INOUT] param_name type

IN:表示輸入參數,OUT:表示輸出參數,INOUT:表示既可以輸入也可以輸出;param_name表示參數的名稱;type表示參數的類型,該類型可以是MySQL資料庫中的任意類型。

characteristics指定存儲過程的特性,可以有以下幾種取值方式:

LANGUAGE SQL: 說明routine_body部分由SQL語句組成,當前系統支持的語言為SQL, SQL是LANGUAGE特性的唯一值;[NOT] DETERMINISTIC: 指明存儲過程執行的結果是否正確。DETERMINISTIC表示結果是確定的。每次執行存儲過程時,相同的輸入會得到相同的輸出;而NOT DETERMINISTIC表示結果是不確定的,相同的輸入可能得到不同的輸入。如果沒有指定任意一個值,默認為NOT DETERMINISTIC。{CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}: 指明子程式使用SQL語句限制。CONTAINS SQL表明子程式包含SQL語句,但是不包含讀寫數據的語句;NO 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代碼的開始與結束。

4. 示例

1) 創建示例資料庫

create database hr;
use hr;

2) 創建示例用到的表並插入樣例數據 

create table employees
(
	employee_id int(11) primary key not null auto_increment,
	employee_name varchar(50) not null,
	employee_sex varchar(10) default '男',
	hire_date datetime not null default current_timestamp,
	employee_mgr int(11),
	employee_salary float default 3000,
	department_id int(11)
);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('David Tian','男',10,7500,1);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Black Xie','男',10,6600,1);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Moses Wang','男',10,4300,1);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Rena Ruan','女',10,5300,1);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Sunshine Ma','女',10,6500,2);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Scott Gao','男',10,9500,2);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Warren Si','男',10,7800,2);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Kaishen Yang','男',10,9500,3);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Simon Song','男',10,5500,3);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Brown Guan','男',10,5000,3);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Eleven Chen','女',10,3500,2);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Cherry Zhou','女',10,5500,4);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Klause He','男',10,4500,5);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Maven Ma','男',10,4500,6);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Stephani Wang','女',10,5500,7);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Jerry Guo','男',10,8500,1);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Gerardo Garza','男',10,25000,8);
insert into employees(employee_name,employee_sex,employee_mgr,employee_salary,department_id) values ('Derek Wu','男',10,5500,5);

3) 查看插入的樣例數據

select * from employees;

 

4) 創建計算平均工資的存儲過程

DELIMITER //
create procedure calculate_emp_sal_avg_p()
begin
	select AVG(employee_salary) as average_salary
	from employees;
end//
DELIMITER ;

說明

DELIMETER //:該語句作用是將MySQL的結果結束符設置為//,因為MySQL默認的語句結束符為分號";",為瞭避免與存儲過程中SQL語句的結束符相沖突,需要使用DELIMETER改變存儲過程的結束符,並以"END //" 結束存儲過程。存儲過程設定完畢以後再使用"DELIMETER ; "恢復默認結束符。DELIMETER也可以指定其它符號為結束符。

5. 調用存儲過程

存儲過程是通過CALL語句進行調用的,語法如下:

CALL sp_name([parameter[,…]])

CALL語句調用一個先前用CREATE PROCEDURE創建的存儲過程,其中sp_name為存儲過程名稱,parameter為存儲過程參數。 

CALL calculate_emp_sal_avg_p();

6. 查看存儲過程

1) SHOW STATUS 語句查看存儲過程

語法

SHOW PROCEDURE STATUS [LIKE 'pattern']

這個語句是一個MySQL的擴展,它返回子程式的特征,如資料庫、名字、類型、創建者及創建日期和修改日期。

LIKE語句表示匹配存儲過程的名稱;

2) SHOW CREATE 語句查看存儲過程設定

語法

SHOW CREATE PROCEDURE sp_name

這個語句是一個MySQL的擴展,類似於SHOW CREATE TABLE,它返回一個可用來重新創建已命名存儲過程的確切字符串。

3) 從information_schema.Routines表中查看存儲過程

語法

SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME='sp_name';

ROUTINE_NAME字段中存儲的是存儲過程或者函數的名稱;sp_name指存儲過程或函數名稱;

如果您們在嘗試的過程中遇到什麼問題或者我的代碼有錯誤的地方,請給予指正,非常感謝!

聯系方式:david.louis.tian@outlook.com

版權@:轉載請標明出處!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *