связано с «параметром 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, что доказывает, что переменная не изменилась, хотя она была передана в хранимую процедуру и ее копия была изменена:

Другие вопросы по тегам