是否可以为 mysql 存储过程设置默认参数?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/982798/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Is it possible to have a default parameter for a mysql stored procedure?
提问by aarona
I have googled this and keep coming up with "No it is not possible" but these posts were dated 2005-2007 so I'm wondering if this has been changed. A code example:
我在谷歌上搜索了这个并不断提出“不,这是不可能的”,但这些帖子的日期是 2005-2007 年,所以我想知道这是否已更改。一个代码示例:
CREATE PROCEDURE `blah`
(
myDefaultParam int = 0 -- This breaks the code for some reason
)
BEGIN
-- Do something here
END
One of the solutions has been to pass null and then check for null and set the variable. I don't want to do that and I shouldn't have to. If this is true then MySql devs need to wake up because there is so much more I could do with MSSQL.
解决方案之一是传递 null,然后检查 null 并设置变量。我不想这样做,也不应该这样做。如果这是真的,那么 MySql 开发人员需要醒来,因为我可以用 MSSQL 做更多的事情。
回答by Paul Sonier
It's still not possible.
这仍然不可能。
回答by Dive50
We worked around this limitation by adding a simple IF statement in the stored procedure. Practically we pass an empty string whenever we want to save the default value in the DB.
我们通过在存储过程中添加一个简单的 IF 语句来解决这个限制。实际上,每当我们想在数据库中保存默认值时,我们都会传递一个空字符串。
CREATE DEFINER=`test`@`%` PROCEDURE `myProc`(IN myVarParam VARCHAR(40))
BEGIN
IF myVarParam = '' THEN SET myVarParam = 'default-value'; END IF;
...your code here...
END
回答by SKManX
SET myParam = IFNULL(myParam, 0);
Explanation: IFNULL(expression_1, expression_2)
解释: IFNULL(expression_1, expression_2)
The IFNULL
function returns expression_1
if expression_1
is not NULL
; otherwise it returns expression_2
. The IFNULL
function returns a string or a numeric based on the context where it is used.
该IFNULL
函数返回expression_1
如果expression_1
不是NULL
; 否则返回expression_2
。该IFNULL
函数根据使用它的上下文返回一个字符串或数字。
回答by Michael
If you look into CREATE PROCEDURE Syntaxfor latest MySQL version you'll see that procedure parameter can only contain IN/OUT/INOUT specifier, parameter name and type.
如果您查看最新 MySQL 版本的CREATE PROCEDURE 语法,您将看到过程参数只能包含 IN/OUT/INOUT 说明符、参数名称和类型。
So, default values are still unavailable in latest MySQL version.
所以,默认值在最新的 MySQL 版本中仍然不可用。
回答by Ross Smith II
Unfortunately, MySQL doesn't support DEFAULT
parameter values, so:
不幸的是,MySQL 不支持DEFAULT
参数值,因此:
CREATE PROCEDURE `blah`
(
myDefaultParam int DEFAULT 0
)
BEGIN
-- Do something here
END
returns the error:
返回错误:
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
To work around this limitation, simply create additional procedures that assign default values to the original procedure:
要解决此限制,只需创建将默认值分配给原始过程的附加过程:
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;
//
Then, running this:
然后,运行这个:
CALL blah(1, 1);
CALL blah2(2, 2);
CALL blah1(3);
CALL blah0();
will return:
将返回:
+--------+--------+
| 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)
Then, if you make sure to only use the blah2()
, blah1()
and blah0()
procedures, your code will not need to be immediately updated, when you add a third parameter to the blah()
procedure.
然后,如果您确保只使用blah2()
,blah1()
和blah0()
过程,那么当您向blah()
过程中添加第三个参数时,您的代码将不需要立即更新。
回答by Bill Karwin
No, this is not supported in MySQL stored routine syntax.
不,这在 MySQL 存储例程语法中不受支持。
Feel free to submit a feature request at bugs.mysql.com.
请随时在bugs.mysql.com提交功能请求。