MySQL(13):数据库存储过程和触发器(上)

本文详细介绍了数据库中的存储过程,包括其定义、使用理由及好处,并通过具体示例展示了如何创建、执行和删除存储过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


2.3 使用存储过程(普通调用)
mysql> Call PRODUCTPRICING();
+--------------+
| priceaverage |
+--------------+
| 2500.0000    |
+--------------+
1 row in set

2.4 删除存储过程

mysql> DROP PROCEDURE productpricing;
Query OK, 0 rows affected


三、下面是一个小例子:


  前提:在数据库已经创建了一个prodect的表,这里使用了Navicat 数据库图形交互软件:



图1


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(对存储过程传入和传出)三个类型的参数。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值