是否有可能有一个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_2
。 IFNULL
函数根据使用它的上下文返回一个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请求。