2017/12/23
一、意义
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。简单来说:就是为以后的使用而保存的一条或多条MySQL语句的集合。可以将其视为批文件,虽然其作用不仅限于批处理。存储过程实际上是一种函数。
使用存储过程的理由:
(1)封装在容易使用的单元中,简化复杂的操作;
(2)保证了数据的完整性,防止过多的步骤造成出错;
(3)简化对变动(表名、列名、业务逻辑)的管理;
使用存储过程的好处:
(1)提高安全性,限制了对基础数据的访问;
(2)提高了性能,存储过程比单独的SQL语句要快;
【存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,
所以使用存储过程可提高数据库执行速度。】
(3)用“只能用在单个请求中的MySQL元素和特征去编写功能更强更灵活的代码”。
二、语法
2.1 执行存储过程
mysql> CALL productpricing(@pricelow,
-> @pricehigh,
-> @priceaverage);
2.2 创建存储过程
mysql> create procedure productpricing()
-> begin
-> select Avg(prod_price) AS priceaverage
-> from products;
-> End;
Query OK, 0 rows affected
mysql> Call PRODUCTPRICING();
+--------------+
| priceaverage |
+--------------+
| 2500.0000 |
+--------------+
1 row in set
2.4 删除存储过程
mysql> DROP PROCEDURE productpricing;
Query OK, 0 rows affected
三、下面是一个小例子:
前提:在数据库已经创建了一个prodect的表,这里使用了Navicat 数据库图形交互软件:
3.1 创建一个存储过程
mysql> CREATE PROCEDURE productpricing(
-> OUT pl DECIMAL(8,2),
-> OUT ph DECIMAL(8,2),
-> OUT pa DECIMAL(8,2)
-> )
-> BEGIN
-> SELECT Min(prod_price)
-> INTO pl
-> FROM product;
-> SELECT Max(prod_price)
-> INTO ph
-> FROM prodect;
-> SELECT Avg(prod_price)
-> INTO pa
-> FROM product;
-> END;
Query OK, 0 rows affected
针对上例进行解释:
(1)关键字:CREATE PROCEDURE / INTO / BEGIN / END ;
(2)CREATE PROCEDURE 新建存储过程;
(3)INTO 表示值从存储过程传出;
(4) BEGIN 和 END :存储过程的代码要位于 BEGIN 和 END 语句内。
3.2 调用存储过程,并且指定3个变量(变量:内存的一个特定的位置,同来临时存储数据,所有MySQL变量必须以‘@’开始):
mysql> CALL productpricing(@pricelow,
-> @pricehigh,
-> @priceaverage);
Query OK, 1 row affected
3.3 显示检索的结果
mysql> SELECT @pricelow,@pricehigh,@priceaverage;
+-----------+------------+---------------+
| @pricelow | @pricehigh | @priceaverage |
+-----------+------------+---------------+
| 2000.00 | 4000.00 | 3033.33 |
+-----------+------------+---------------+
1 row in set
PS:MySQL支持IN (传递给存储过程)、OUT(从存储过程传出)、INOUT(对存储过程传入和传出)三个类型的参数。