【问题标题】:Is it possible to have a default parameter for a mysql stored procedure?mysql存储过程可以有默认参数吗?
【发布时间】:2010-11-02 05:44:38
【问题描述】:

我已经用谷歌搜索了这个并不断提出“不,这是不可能的”,但这些帖子的日期是 2005-2007,所以我想知道这是否已经改变。代码示例:

CREATE PROCEDURE `blah`
(
  myDefaultParam int = 0 -- This breaks the code for some reason
)
BEGIN
  -- Do something here
END

其中一种解决方案是传递 null,然后检查 null 并设置变量。我不想这样做,也不应该这样做。如果这是真的,那么 MySql 开发人员需要醒来,因为我可以用 MSSQL 做更多事情。

【问题讨论】:

标签: sql mysql stored-procedures default-value


【解决方案1】:

还是不行。

【讨论】:

  • 有什么解决方法吗?就像检查参数是否为空然后给它一个默认值?
  • @papaiatis 是的,您可以添加一个 if 语句,请参阅下面我的另一篇文章。
  • 我不知道为什么这是公认的答案,因为下面@Dive50 有一个有用的解决方法,我即将实施,因为我面临同样的问题。
  • 这就是我讨厌 MySQL 的原因。这么基本的东西还没有
  • 不可能使用建议的语法,但是传递 NULL 然后使用 IFNULL 是完全可能的,并且实现了完全相同的事情。
【解决方案2】:

我们通过在存储过程中添加一个简单的 IF 语句来解决这个限制。实际上,每当我们想将默认值保存在数据库中时,我们都会传递一个空字符串。

CREATE DEFINER=`test`@`%` PROCEDURE `myProc`(IN myVarParam VARCHAR(40))
BEGIN
  IF myVarParam = '' THEN SET myVarParam = 'default-value'; END IF;

  ...your code here...
END

【讨论】:

  • 为什么不改用null
  • 这显示了你可以对mysql有多大的爱,同时在sql中你可以简单地输入“param_name int(11) = NULL”......谢谢Oracle
【解决方案3】:
SET myParam = IFNULL(myParam, 0);

解释:IFNULL(expression_1, expression_2)

如果expression_1 不是NULL,则IFNULL 函数返回expression_1;否则返回expression_2IFNULL 函数根据使用它的上下文返回一个字符串或一个数字。

【讨论】:

  • 这是更有效的方法。
【解决方案4】:

如果您查看CREATE PROCEDURE Syntax 以获得最新的 MySQL 版本,您会发现过程参数只能包含 IN/OUT/INOUT 说明符、参数名称和类型。

因此,在最新的 MySQL 版本中,默认值仍然不可用。

【讨论】:

    【解决方案5】:

    很遗憾,MySQL 不支持DEFAULT 参数值,所以:

    CREATE PROCEDURE `blah`
    (
      myDefaultParam int DEFAULT 0
    )
    BEGIN
      -- Do something here
    END
    

    返回错误:

    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual
    that corresponds to your MySQL server version for the right syntax to use 
    near 'DEFAULT 0) BEGIN END' at line 3
    

    要解决此限制,只需创建为原始过程分配默认值的附加过程:

    DELIMITER //
    
    DROP PROCEDURE IF EXISTS blah//
    DROP PROCEDURE IF EXISTS blah2//
    DROP PROCEDURE IF EXISTS blah1//
    DROP PROCEDURE IF EXISTS blah0//
    
    CREATE PROCEDURE blah(param1 INT UNSIGNED, param2 INT UNSIGNED)
    BEGIN
        SELECT param1, param2;
    END;
    //
    
    CREATE PROCEDURE blah2(param1 INT UNSIGNED, param2 INT UNSIGNED)
    BEGIN
        CALL blah(param1, param2);
    END;
    //
    
    CREATE PROCEDURE blah1(param1 INT UNSIGNED)
    BEGIN
        CALL blah2(param1, 3);
    END;
    //
    
    CREATE PROCEDURE blah0()
    BEGIN
        CALL blah1(4);
    END;
    //
    

    然后,运行这个:

    CALL blah(1, 1);
    CALL blah2(2, 2);
    CALL blah1(3);
    CALL blah0();
    

    将返回:

    +--------+--------+
    | param1 | param2 |
    +--------+--------+
    |      1 |      1 |
    +--------+--------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    +--------+--------+
    | param1 | param2 |
    +--------+--------+
    |      2 |      2 |
    +--------+--------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    +--------+--------+
    | param1 | param2 |
    +--------+--------+
    |      3 |      3 |
    +--------+--------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    +--------+--------+
    | param1 | param2 |
    +--------+--------+
    |      4 |      3 |
    +--------+--------+
    1 row in set (0.00 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    

    然后,如果您确保只使用blah2()blah1()blah0() 过程,那么当您向blah() 过程添加第三个参数时,您的代码将不需要立即更新。

    【讨论】:

      【解决方案6】:

      不,这在 MySQL 存储例程语法中不受支持。

      请随时通过bugs.mysql.com 提交功能请求。

      【讨论】:

      猜你喜欢
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 2016-11-04
      • 2016-08-31
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      相关资源
      最近更新 更多