Возможно ли иметь параметр по умолчанию для хранимой процедуры mysql? - PullRequest
61 голосов
/ 11 июня 2009

Я гуглил это и продолжаю придумывать «Нет, это невозможно», но эти посты были датированы 2005-2007 гг., Поэтому мне интересно, изменилось ли это. Пример кода:

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

Одним из решений было передать значение null, а затем проверить наличие значения null и установить переменную. Я не хочу этого делать, и я не должен был этого делать. Если это так, то разработчикам MySql нужно проснуться, потому что я могу сделать гораздо больше с MSSQL.

Ответы [ 6 ]

63 голосов
/ 11 июня 2009

Это все еще невозможно.

44 голосов
/ 10 июля 2012

Мы обошли это ограничение, добавив простой оператор IF в хранимую процедуру. Практически мы передаем пустую строку всякий раз, когда хотим сохранить значение по умолчанию в БД.

CREATE DEFINER=`test`@`%` PROCEDURE `myProc`(IN myVarParam VARCHAR(40))
BEGIN
  IF myVarParam = '' THEN SET myVarParam = 'default-value'; END IF;

  ...your code here...
END
19 голосов
/ 04 марта 2015
SET myParam = IFNULL(myParam, 0);

Объяснение: IFNULL(expression_1, expression_2)

Функция IFNULL возвращает expression_1, если expression_1 не NULL; в противном случае возвращается expression_2. Функция IFNULL возвращает строку или число в зависимости от контекста, в котором она используется.

11 голосов
/ 11 июня 2009

Если вы посмотрите на CREATE PROCEDURE Syntax для последней версии MySQL, вы увидите, что параметр процедуры может содержать только спецификатор IN / OUT / INOUT, имя и тип параметра.

Таким образом, значения по умолчанию все еще недоступны в последней версии MySQL.

4 голосов
/ 02 октября 2012

К сожалению, 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().

1 голос
/ 11 июня 2009

Нет, это не поддерживается в синтаксисе хранимых процедур MySQL.

Не стесняйтесь отправлять запрос на функцию bugs.mysql.com .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...