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

我GOOGLE了这一点,并不断提出“不,这是不可能的”,但这些职位是2005 – 2007年,所以我想知道这是否已经改变。 一个代码示例:

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

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

这仍然是不可能的。

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

 CREATE DEFINER=`test`@`%` PROCEDURE `myProc`(IN myVarParam VARCHAR(40)) BEGIN IF myVarParam = '' THEN SET myVarParam = 'default-value'; END IF; ...your code here... END 
 SET myParam = IFNULL(myParam, 0); 

说明: IFNULL(expression_1, expression_2)

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

如果您查看最新的MySQL版本的CREATE PROCEDURE语法 ,您将看到procedure参数只能包含IN / OUT / INOUT说明符,参数名称和types。

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

不幸的是,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 

要解决此限制,只需创build将默认值分配给原始过程的其他过程即可:

 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()过程中添加第三个参数时,不需要立即更新代码。

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

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