是否有可能有一个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做更多的事情。
答
如果您查看CREATE PROCEDURE Syntax以了解最新的MySQL版本,您会看到过程参数只能包含IN/OUT/INOUT说明符,参数名称和类型。
因此,默认值在最新的MySQL版本中仍然不可用。
答
我们通过在存储过程中添加简单的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_1
不NULL
;否则返回expression_2
。 IFNULL
函数根据使用它的上下文返回一个字符串或数字。
重复:http://stackoverflow.com/questions/12652241/writing-optional-parameters-within-stored-procedures-in-mysql – 2014-02-06 09:41:52
确实mariaDB有这个相同的问题? – 2017-09-03 18:31:47