是否可以为mysql存储过程设置默认参数?

aar*_*ona 64 mysql sql stored-procedures default-value

我已经用Google搜索并继续提出"不可能"但这些帖子的日期是2005 - 2007年,所以我想知道这是否已经改变了.一个代码示例:

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

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

Pau*_*ier 68

它仍然不可能.

  • 有没有解决方法?像检查参数是否为null然后给它一个默认值? (7认同)
  • 我不知道为什么这是下面这里接受的答案@ Dive50有一个有用的解决方法,我即将实施,因为我面临同样的问题. (3认同)
  • 这就是我讨厌MySQL的原因.这样一个基本的东西仍然不存在 (2认同)
  • 不可能使用建议的语法,但传递 NULL 然后使用 IFNULL 是完全可能的,并且可以实现完全相同的效果。 (2认同)

小智 46

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

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

  ...your code here...
END
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用`null`呢? (7认同)
  • 这表明您可以对 mysql 给予多少爱,同时在 sql 中您可以简单地输入“param_name int(11) = NULL”……谢谢 Oracle (2认同)

小智 21

SET myParam = IFNULL(myParam, 0);
Run Code Online (Sandbox Code Playgroud)

说明: IFNULL(expression_1, expression_2)

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

  • 这是更有效的方法。 (2认同)

Mic*_*ael 12

如果您查看最新MySQL版本的CREATE PROCEDURE语法,您将看到该过程参数只能包含IN/OUT/INOUT说明符,参数名称和类型.

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


Ros*_* II 5

不幸的是,MySQL 不支持DEFAULT参数值,因此:

CREATE PROCEDURE `blah`
(
  myDefaultParam int DEFAULT 0
)
BEGIN
  -- Do something here
END
Run Code Online (Sandbox Code Playgroud)

返回错误:

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
Run Code Online (Sandbox Code Playgroud)

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

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;
//
Run Code Online (Sandbox Code Playgroud)

然后,运行这个:

CALL blah(1, 1);
CALL blah2(2, 2);
CALL blah1(3);
CALL blah0();
Run Code Online (Sandbox Code Playgroud)

将返回:

+--------+--------+
| 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)
Run Code Online (Sandbox Code Playgroud)

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