Подтвердить что ты не робот

Возможно ли иметь параметр по умолчанию для хранимой процедуры mysql?

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

  ...your code here...
END

Ответ 3

SET myParam = IFNULL(myParam, 0);

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Не забудьте отправить запрос функции bugs.mysql.com.

Ответ 7

У меня есть запрос функции: отказаться от попыток написать DBMS, MySQL; вы были перехвачены и превосходят SQL Server. Эта проблема, и ваша совершенно неуместная поддержка взгляда, произвели на меня очень плохое впечатление. Если бы я не был вынужден использовать ваш продукт, я бы не стал.