【问题标题】:Does a SELECT statement make sense in a MySQL stored PROCEDURE?SELECT 语句在 MySQL 存储过程中是否有意义?
【发布时间】:2016-04-20 12:05:45
【问题描述】:

我的系统:MySQL 5.6.12

由于您不能像函数一样在 SQL 语句中使用存储过程,我想知道只有 SELECT 语句但没有 OUT/INOUT 参数或进行一些操作的存储过程是否有任何用途。

例子:

DELIMITER //
CREATE PROCEDURE sp ()
    BEGIN
        SELECT * FROM tbl;
    END //
DELIMITER ;

我可以这样调用存储过程:

CALL sp();

它在 IDE 中显示了一个结果集,但除此之外我看不到任何真正的实际用途。

我错过了什么吗?

【问题讨论】:

  • 可能是用不必要的存储程序弄乱数据库或者可能增加复杂性和混淆?或者,其目的可能是在不修改调用者的情况下添加修改 SQL 语句的能力。或者,也许它是增强程序的占位符。除此之外,我认为添加这样的程序没有任何好处。 (也许这是一个答案,而不是评论。)
  • 有这样一个存储过程来帮助调试怎么样?
  • 即使出于调试目的,如果没有 IN 参数,我认为使用这种过程比直接使用 select 语句或创建视图没有任何好处。
  • @spencer7593 和 IN 参数在例如SQL 服务器。在那里,您可以在代码中使用结果集,而不仅仅是在编辑器中显示。但不幸的是,对于 sp,MySQL 显然还不成熟。
  • @John:MySQL 过程可以使用 IN 和 OUT 参数。 MySQL 过程还可以定义游标,从中获取行,并在过程中使用它们而不将结果集返回给调用者。也可以运行返回单行 INTO 过程或用户定义变量的 SELECT,同样而不将结果集返回给调用者。 (我之前的评论提到了一个 MySQL 存储过程,它包含 only 单个静态 SELECT 语句,该语句将单个结果集返回给调用者。这有原因吗?也许吧。有充分的理由吗? ? 不太可能)

标签: mysql sql procedure out inout


【解决方案1】:

好吧,只是一个 SELECT 语句正在推动它;但是返回结果集的无参数存储过程有很多正当理由。 Thilo的回答提到了主要的;加强...

如果有一个经常需要的特定结果集(例如某种监控/仪表板数据)但过于复杂而无法放入 VIEW 中,则可以将所需的数据操作封装在这样的存储过程中,从而减少对各种客户来独立重现相同的确切步骤。

【讨论】:

    【解决方案2】:

    它所做的只是将查询的详细信息从调用者那里移开(这是一种有效的做法,简化了客户端代码并简化了架构迁移)。您不妨为此使用视图。

    如果需要带参数,我只会使用存储过程。

    【讨论】:

    • 即使使用IN 参数,它也保持不变:CREATE PROCEDURE sp (IN id INT) BEGIN SELECT * FROM tbl WHERE tbl.id = id; END
    • 是的,我就是这个意思。如果它需要参数,存储过程可以做到。查看不能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多