77

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

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

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

4

6 回答 6

80

这仍然是不可能的。

于 2009-06-11T18:29:41.027 回答
53

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

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

  ...your code here...
END
于 2012-07-09T23:34:56.373 回答
34
SET myParam = IFNULL(myParam, 0);

解释:IFNULL(expression_1, expression_2)

IFNULL函数返回expression_1if is expression_1not ; NULL否则返回expression_2。该IFNULL函数根据使用它的上下文返回一个字符串或一个数字。

于 2015-03-04T14:36:54.093 回答
12

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

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

于 2009-06-11T18:34:58.520 回答
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()

于 2012-10-02T16:02:09.373 回答
1

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

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

于 2009-06-11T18:40:13.810 回答