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