3.1 调用格式

存储过程有多种调用方法。存储过程必须使用CALL语句调用,并且存储过程和数据库相关,如果要执行其他数据库中的存储过程,需要指定数据库名称,例如CALL dbname.procname。

  1. CALL 存储过程名(实参列表)

格式:

1、调用in模式的参数:

  1. CALL sp1('值');

2、调用out模式的参数:

  1. SET @name;
  2. CALL sp1(@name);
  3. SELECT @name;

3、调用inout模式的参数:

  1. SET @name=值;
  2. CALL sp1(@name);
  3. SELECT @name;

3.2 代码举例

举例1:

  1. DELIMITER //
  2. CREATE PROCEDURE CountProc(IN sid INT,OUT num INT)
  3. BEGIN
  4. SELECT COUNT(*) INTO num FROM fruits
  5. WHERE s_id = sid;
  6. END //
  7. DELIMITER ;

调用存储过程:

  1. mysql> CALL CountProc (101, @num);
  2. Query OK, 1 row affected (0.00 sec)

查看返回结果:

  1. mysql> SELECT @num;

该存储过程返回了指定 s_id=101 的水果商提供的水果种类,返回值存储在num变量中,使用SELECT查看,返回结果为3。

举例2:创建存储过程,实现累加运算,计算 1+2+…+n 等于多少。具体的代码如下:

  1. DELIMITER //
  2. CREATE PROCEDURE `add_num`(IN n INT)
  3. BEGIN
  4. DECLARE i INT;
  5. DECLARE sum INT;
  6. SET i = 1;
  7. SET sum = 0;
  8. WHILE i <= n DO
  9. SET sum = sum + i;
  10. SET i = i +1;
  11. END WHILE;
  12. SELECT sum;
  13. END //
  14. DELIMITER ;

如果你用的是 Navicat 工具,那么在编写存储过程的时候,Navicat 会自动设置 DELIMITER 为其他符号,我们不需要再进行 DELIMITER 的操作。

直接使用 CALL add_num(50);即可。这里我传入的参数为 50,也就是统计 1+2+…+50 的积累之和。

3.3 如何调试

在 MySQL 中,存储过程不像普通的编程语言(比如 VC++、Java 等)那样有专门的集成开发环境。因此,你可以通过 SELECT 语句,把程序执行的中间结果查询出来,来调试一个 SQL 语句的正确性。调试成功之后,把 SELECT 语句后移到下一个 SQL 语句之后,再调试下一个 SQL 语句。这样逐步推进,就可以完成对存储过程中所有操作的调试了。当然,你也可以把存储过程中的 SQL 语句复制出来,逐段单独调试。