是否有可能有一个MySQL存储过程的默认参数?

问题描述:

我GOOGLE了这个,并继续提出“不,这是不可能的”,但这些职位是2005-2007年,所以我想知道如果这已改变。代码示例:是否有可能有一个MySQL存储过程的默认参数?

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

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

+1

重复:http://*.com/questions/12652241/writing-optional-parameters-within-stored-procedures-in-mysql – 2014-02-06 09:41:52

+0

确实mariaDB有这个相同的问题? – 2017-09-03 18:31:47

这仍然是不可能的。

+5

有没有解决方法?像检查参数是否为空,然后给它一个默认值? – papaiatis 2012-03-13 14:33:27

+1

@papaiatis是的,你可以添加一个if语句,看看我下面的其他帖子。 – Dive50 2012-07-09 23:36:06

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

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

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

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

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

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

    ...your code here... 
END 

不幸的是,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()过程添加第三个参数时更新。

SET myParam = IFNULL(myParam, 0); 

说明:IFNULL(expression_1, expression_2)

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