могу ли я получать предупреждения о конфликте имен (затенение) в процедуре mysql - PullRequest
0 голосов
/ 09 мая 2020

Если имя локальной переменной совпадает с именем аргумента, аргумент отменяется (затеняется). Если локальная переменная не инициализирована, она будет NULL, независимо от значения, переданного через аргумент. У меня была процедура с этой ситуацией (ниже), и не было никаких предупреждений или ошибок. Есть ли какой-то параметр, который будет выдавать предупреждения или ошибки, если переменные затенены?

CREATE DEFINER=`dev`@`localhost` PROCEDURE `new_empErrShadow`(in idVar int)
BEGIN
DECLARE idVar INT;  -- ERROR shadows arg idVar, get null value (name conflict)

insert into Employees values (idVar, 28, 'ttt', 'lastname');

-- try get warning about variable shadow. Doesn't work
show errors;  
show warnings;
END

Использование MySQL 5.7, но 8.0, согласно документации. Конфликты имен в сохраненных программах в MySQL :: MySQL 5.7 Справочное руководство :: 23.8 Ограничения для сохраненных программ

1 Ответ

0 голосов
/ 09 мая 2020

Я бы порекомендовал вам вместо этого использовать согласованные соглашения об именах:

CREATE DEFINER=`dev`@`localhost` PROCEDURE `new_empErrShadow` (
    in in_idVar int
)
BEGIN
    DECLARE p_idVar INT;  -- ERROR shadows arg idVar, get null value (name conflict)

    insert into Employees values (in_idVar, 28, 'ttt', 'lastname');

    -- try get warning about variable shadow. Doesn't work
    show errors;  
    show warnings;
END;

Такая согласованность поможет вам самостоятельно предотвратить ошибки.

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