Возможно ли иметь параметр по умолчанию для хранимой процедуры 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.

1030   6  

6 ответов:

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

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

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)

The IFNULL возвращает функция expression_1 Если expression_1 - это не NULL; в противном случае возвращается expression_2. Элемент IFNULL функция возвращает строку или число в зависимости от контекста, в котором она используется.

Если вы посмотрите на создать синтаксис процедуры для последней версии MySQL вы увидите, что параметр процедуры может содержать только 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.

Comments

    Ничего не найдено.