跳至主要內容

什么是存储过程,为什么不推荐使用存储过程

fangzhipeng约 802 字大约 3 分钟

什么是存储过程

存储过程(Stored Procedure)是预先定义在数据库管理系统中的一组 SQL 语句集合,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程通常用于执行一系列复杂的数据库操作或特定的业务逻辑,可以被应用程序通过调用来执行。

存储过程相对于sql语句有以下的优势:

  • 性能很高:存储过程在数据库服务器上执行,减少了网络传输和数据处理时间,尤其在处理大量数据或复杂逻辑时表现更明显。
  • 安全性很高:存储过程只需要传参数,可以有效的防止SQL注入
  • 简化维护和分离业务逻辑:将业务逻辑封装在存储过程中,可以降低应用和数据库之间的耦合度。

为什么不推荐使用存储过程

首先来看一下存储过程的使用示例,以下是一个简单的 MySQL 存储过程示例,用于查询指定用户的订单数量:

DELIMITER //

CREATE PROCEDURE GetOrderCount(IN userId INT)
BEGIN
    DECLARE orderCount INT;
    
    SELECT COUNT(*) INTO orderCount
    FROM orders
    WHERE user_id = userId;
    
    SELECT orderCount ;
END//

DELIMITER ;

在这个示例中:

  • 创建了一个名为 GetOrderCount 的存储过程,接受一个名为 userId 的输入参数。
  • 使用 DECLARE 声明了一个本地变量 orderCount,用于存储订单数量。
  • 使用 SELECT COUNT(*) INTO 查询订单数量,并将结果赋值给 orderCount 变量。
  • 最后通过 SELECT 语句返回订单数量。

要调用该存储过程,可以使用以下 SQL 语句:

CALL GetOrderCount(123);

这里的 123 是要查询订单数量的用户 ID。调用此存储过程后,将返回该用户的订单数量。

从上面的示例可以看出尽管可以将比较复杂的业务逻辑封装在存储过程里,但是有以下的致命弱点:

  • 可移植性非常差:存储过程的语法和特性在不同的数据库管理系统中可能有所差异,这会导致数据库迁移的时候会面临灾难性的后果。

  • 可读性差:存储过程通常包含大量的代码,这可能导致可读性非常差。

  • 可调试性差:相比将业务逻辑放在应用程序代码中,存储过程的可调试性非常的差。

  • 维护困难:存储过程通常可能是由DBA人员维护的,应用开发人员在使用存储过程需要和DBA沟通,另外维护维护是非常困难的。

阿里巴巴的开发手册里明确不推荐使用存储过程:

因为Mysql不会考虑不受其控制的操作成本,存储过程难以调试和扩展,更没有移植性。

方志朋_官方公众号
方志朋_官方公众号