簡體   English   中英

是否可以為mysql存儲過程設置默認參數?

[英]Is it possible to have a default parameter for a mysql stored procedure?

我已經用Google搜索並繼續提出“不可能”但這些帖子的日期是2005 - 2007年,所以我想知道這是否已經改變了。 一個代碼示例:

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

其中一個解決方案是傳遞null,然后檢查null並設置變量。 我不想那樣做,我不應該這樣做。 如果這是真的那么MySql開發者需要醒來,因為我可以用MSSQL做更多的事情。

它仍然不可能。

我們通過在存儲過程中添加一個簡單的IF語句來解決這個限制。 實際上,每當我們想要在DB中保存默認值時,我們都會傳遞一個空字符串。

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函數根據使用它的上下文返回一個字符串或數字。

如果您查看最新MySQL版本的CREATE PROCEDURE語法 ,您將看到該過程參數只能包含IN / OUT / INOUT說明符,參數名稱和類型。

因此,默認值在最新的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

要解決此限制,只需創建將默認值分配給原始過程的其他過程:

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上提交功能請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM