связано с «параметром IN» в MySQL
когда я гуглил параметр IN, я получил это..
значение параметра IN защищено. Это означает, что даже если значение параметра IN изменяется внутри процедуры, его исходное значение сохраняется после завершения процедуры (как передача по значению).
я не понял контекст приведенного выше результата поиска
я попробовал этот код, но исходное значение изменилось с 1 на 2.
delimiter //
CREATE PROCEDURE MyProcedure(IN myParameter INT)
BEGIN
-- Output the original value
SELECT myParameter AS 'OriginalValue';
-- Rest of the code
-- Modify the parameter value (which should be avoided)
SET myParameter = myParameter + 1;
-- Output the modified value
SELECT myParameter AS 'ModifiedValue';
END //
delimiter ;
call myprocedure(1);
2 ответа
Попробуй это:
set @myvar = 1;
call myprocedure(@myvar);
select @myvar;
Если параметр объявлен какIN
параметра в вашей процедуре, исходное значение 1 сохраняется после вызова процедуры.
Если параметр объявлен как параметр, увеличенное значение станет новым значением переменной в вашем сеансе.
set @myvar = 1;
call myprocedure(@myvar);
...
select @myvar;
+--------+
| @myvar |
+--------+
| 2 |
+--------+
Это актуально только в том случае, если вы передаете переменную в качестве аргумента. Не разрешается передавать в процедуру числовой литерал в качествеINOUT
илиOUT
параметр.
call myprocedure(1)
ERROR 1414 (42000): OUT or INOUT argument 1 for routine test.MyProcedure is not a variable or NEW pseudo-variable in BEFORE trigger
По сути, у вас есть хранимая процедура, и вы успешно меняете значение переменной внутри процедуры, но это всего лишь копия оригинала. Если у вас есть переменная, которой присваивается значение, а затем передается в хранимую процедуру, то после завершения хранимой процедуры переменная, которую вы ей передали, останется неизменной, даже если вы изменили ее копию внутри хранимой процедуры.
Подумайте об этом так:
- у тебя есть лист бумаги
- ты копируешь этот лист бумаги
- ты меняешь копию
- но исходное не меняется при смене копии
Пример:
delimiter //
CREATE PROCEDURE MyProcedure(IN myParameter INT)
BEGIN
-- Output the original value
SELECT myParameter AS 'OriginalValue';
-- Rest of the code
-- Modify the parameter value (which should be avoided)
SET myParameter = myParameter + 1;
-- Output the modified value
SELECT myParameter AS 'ModifiedValue';
END //
delimiter ;
SET @myParameter = 1;
call myprocedure(@myParameter);
SELECT @myParameter as `NotReallyModified`;
Результатом последней выборки является 1, что доказывает, что переменная не изменилась, хотя она была передана в хранимую процедуру и ее копия была изменена: