目录

一、定义

二、关键字

三、语法

1、创建存储过程

2、调用存储过程

(1)直接调用,传递输入参数

(2)直接调用,包含输入参数和输出参数

3、存储过程的参数

4、调试

四、 使用示例

1、输入客户ID,返回客户名称

(1)创建存储过程

(2)调用存储过程

(3)删除存储过程

2、接受一个参数并返回该参数的两倍

(1)功能说明

(2)代码

(3)调用存储过程

3、接受一个名字作为输入,返回一个问候语作为输出

(1)存储过程的代码

(2)调用这个存储过程

五、注意事项


一、定义

        MySQL的存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,它存储在数据库中,并可以通过指定的名字并给定参数(如果有的话)来被调用。存储过程可以视为数据库中的函数,但与函数不同的是,存储过程允许执行包括修改表在内的复杂操作,并且可以返回多个值(通过输出参数或结果集)。

二、关键字

       存储过程的语法中包含如下一些关键字:

  1. CREATE PROCEDURE:创建一个新的存储过程。
  2. DELIMITER:用于更改语句结束符,这对于包含多个语句的存储过程尤其重要。
  3. BEGIN 和 END:定义存储过程体的开始和结束。在简单的存储过程中,如果只有一条SQL语句,可以省略这对关键字。
  4. DECLARE:声明变量、游标、条件和处理器。
  5. SET 和 SELECT:用于赋值和查询数据。
  6. IF-ELSE:条件语句。
  7. CASE:多条件分支语句。
  8. LOOP 和 REPEAT:循环结构。
  9. LEAVE 和 ITERATE:用于提前退出循环或跳过循环迭代。
  10. RETURN:返回值或结果集。
  11. CALL:调用存储过程。
  12. INOUTINOUT:这些关键字用于指定存储过程的参数是输入参数、输出参数还是既是输入又是输出参数,指定存储过程参数的方向
  13. DROP PROCEDURE:用于删除存储过程。

三、语法

1、创建存储过程

DELIMITER //


CREATE PROCEDURE procedure_name (parameters)
BEGIN
    -- SQL 语句
END;

DELIMITER ;

        解释如下: 

  • DELIMITER 关键字用于改变语句的分隔符,因为存储过程内部可能需要使用分号 ; 来分隔多条 SQL 语句。
  • CREATE PROCEDURE 关键字用于创建一个新的存储过程。
  • procedure_name 是存储过程的名称。
  • parameters 是存储过程的参数列表,可以是输入参数(IN),输出参数(OUT),输入输出参数(INOUT),或者无参数(没有关键字)。
  • BEGIN ... END; 块包含了存储过程的主体,其中的 -- SQL 语句 是要执行的 SQL 命令。

2、调用存储过程

(1)直接调用,传递输入参数

        CALL procedure_name (parameters);

  • CALL 关键字用于调用存储过程。
  • procedure_name 是存储过程的名称。
  • parameters 是传递给存储过程的参数值。

(2)直接调用,包含输入参数和输出参数

        CALL sp_example(5, @result);

        这里 @result 是一个用户变量,用于接收存储过程的输出参数。

3、存储过程的参数

        存储过程的参数可以有以下三种类型:

  • IN 参数:输入参数,调用存储过程时提供值。
  • OUT 参数:输出参数,存储过程会返回值。
  • INOUT 参数:输入输出参数,可以在存储过程中设置值,并从调用方获取值。

4、调试

        可以通过查看存储过程的定义、使用 SHOW CREATE PROCEDURE 命令,或在存储过程中使用 SELECT 语句输出中间结果来进行调试。

四、 使用示例

1、输入客户ID,返回客户名称

(1)创建存储过程

CREATE PROCEDURE GetCustomerNameByID(IN customerID INT, OUT customerName VARCHAR(100))
BEGIN

    SELECT name INTO customerName FROM customers WHERE id = customerID;
END;

        这个存储过程接受一个客户ID作为输入参数,并返回该客户的名字作为输出参数。

(2)调用存储过程

        CALL GetCustomerNameByID(1, @customerName);

        SELECT @customerName;

        首先,使用`CALL`语句调用`GetCustomerNameByID`存储过程,传入客户ID(这里为1)和一个用户定义的变量`@customerName`来接收输出。

        然后,通过`SELECT`语句查询并显示该变量的值。

(3)删除存储过程

        DROP PROCEDURE IF EXISTS GetCustomerNameByID;

        这条语句用于删除名为`GetCustomerNameByID`的存储过程,如果它存在的话。

2、接受一个参数并返回该参数的两倍

(1)功能说明

        存储过程 double_value 接受一个输入参数 in_value 并计算其两倍的值,将结果存储在输出参数 out_value 中。调用存储过程时,使用一个用户变量 @output 来接收输出参数的值,然后通过 SELECT 语句显示结果。

(2)代码

DELIMITER $$

CREATE PROCEDURE double_value(IN in_value INT, OUT out_value INT)
BEGIN
    SET out_value = in_value * 2;
END $$

DELIMITER ;

(3)调用存储过程

         调用存储过程,命令如下:

        CALL double_value(10, @output);

        SELECT @output;

3、接受一个名字作为输入,返回一个问候语作为输出

(1)存储过程的代码

DELIMITER //


CREATE PROCEDURE Greeting(IN name VARCHAR(255), OUT greeting VARCHAR(255))
BEGIN
    SET greeting = CONCAT('Hello, ', name);
END;

DELIMITER ;

        Greeting 存储过程接受一个名字作为输入参数,并返回一个问候语。调用时,我们使用一个变量 @greeting 来捕获输出参数的值。

(2)调用这个存储过程

        SET @greeting;

        CALL Greeting('World', @greeting);

        SELECT @greeting;

五、注意事项

(1)存储过程可以提高应用程序的性能,因为它们减少了应用程序和数据库服务器之间的通信次数。

(2)存储过程在数据库服务器上执行,这有助于减少网络流量。

(3)存储过程可以封装复杂的业务逻辑,使得代码更加模块化和易于管理。

(4)过度使用存储过程可能会使数据库逻辑变得难以理解和维护,尤其是在大型项目中。

(5)存储过程与数据库的耦合度较高,这可能会影响到数据库的移植性。


文章正下方可以看到我的联系方式:鼠标“点击” 下面的 “威迪斯特-就是video system 微信名片”字样,就会出现我的二维码,欢迎沟通探讨。


Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐