MySQL数据库存储过程教程

使用存储过程先得了解怎样使用它们,存储过程被执行的次数远远的多于它被写的次数,因此本文先介绍怎样执行存储过程。之后再介绍怎样创建存储过程和其他一些操作。

执行存储过程的方法

MySQL通过类似函数调用的方法来执行存储过程,因此使用一个简单的关键字CALL就能实现调用。CALL命令需要存储过程的名字以及需要传递给它的参数来调用。例如如下的例子:

CALL productpricing(@pricelow,
                    @pricehigh,
                    @priceaverage);

 

这里一个名字是productpricing的存储过程被调用,它计算并返回产品的最低、最高和平均价格。

存储过程可能会也可能不会打印结果,很快你就会看到。

创建存储过程

已经解释过,写一个存储过程并非微不足道。先看一个简单的例子,该存储过程返回了产品的平均价格:

CREATE PROCEDURE productpricing()
BEGIN
   SELECT Avg(prod_price) AS priceaverage
   FROM products;
END;

 

该存储过程名字是productpricing,使用一句CREATE PROCEDURE productpricing()就能定义它。如果该存储过程要带参数的话,放到括号中间就可以。虽然本存储过程不带参数,但是()两个括号也必须写上。BEGIN和END关键词用于区分存储过程的body,该body自己只有一个select语句。

当MySQL执行该段代码的时候,它会创建一个叫做productpricing的存储过程,因为并没有被调用所以不会有返回值,它只是被创建以待将来使用。

如果你使用的是MySQL的命令行,还需要注意分隔符问题。默认的MySQL分隔符是分号“;”,然而我们执行MySQL命令的时候用的分隔符也是分号。如果命令工具试图解释一个存储过程的时候,因为里面有分号会被当做SQL命令执行,但是一个存储过程可能还没有定义完,这时候就会出错。

解决方法是我们可以临时的改变MySQL命令段的分隔符:

DELIMITER //
CREATE PROCEDURE productpricing()
BEGIN
   SELECT Avg(prod_price) AS priceaverage
   FROM products;
END //
DELIMITER ;

 

本代码中DELIMITER //告诉命令端使用//作为新的命令分隔符,所以本代码中原来的“END;”变成了现在的“END//”,这样的话,存储过程内部的分号将不被作为命令分隔符解释,整个存储过程被一起当做整体传递给解释引擎。最后DELIMITER ;将默认分隔符设置回去。

除了\符号,任何符号可以作为命令分隔符。

如果你使用MySQL命令行来做实验,一定要注意对命令分隔符的处理。

使用该存储过程的方法:

CALL productpricing();

 

+--------------+
| priceaverage |
+--------------+
|    16.133571 |
+--------------+

 

 

CALL productpricing();该命令执行了刚才创建的存储过程并输出了结果。因为存储过程被当做函数来调用,即使没有参数,也需要在名字后面带上括号。

删除存储过程的方法

存储过程一旦被创建,除非删除它,否则一直存在于服务器上等待调用。drop命令可以删除服务器上的指定存储过程。

DROP PROCEDURE productpricing;

 

该句删除了刚刚创建的存储过程。注意名字后面没有带括号(),这里只用指定名字。

如果服务器上并没有存在该存储过程,该语句会抛出一个错误。为了避免这种情况,我们可以使用另一种调用方法:“DROP PROCEDURE IF EXISTS”,这样只有在存在的时候才会执行删除。

带参数的存储过程

productpricing是一个只展示结果的简单的存储过程。但是一般来说存储过程并不展示结果,它们将结果存入你传入的参数里面。

相关推荐

Leave a Comment