対応方法:ERROR 1414 (42000): OUT or INOUT argument 1 for routine test.testproc1 is not avariable or NEW pseudo-variable in BEFORE trigger
ストアドプロシージャを実行する際に、 OUT や INOUT で指定された引数に対して、変数ではなく値を直接渡した場合、 ERROR 1414 (42000): OUT or INOUT argument 1 for routine test.testproc1 is not avariable or NEW pseudo-variable in BEFORE trigger というエラーが発生します。
次の例では、testproc1 というストアドプロシージャの INOUT の引数 prmInOut にリテラルで数値を直接渡してエラーが出ている例です。
mysql> DELIMITER // mysql> CREATE PROCEDURE testproc1(INOUT prmInOut INT) -> BEGIN -> SET prmInOut = 1234 + prmInOut; -> END -> // Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ; mysql> CALL testproc1(1); ERROR 1414 (42000): OUT or INOUT argument 1 for routine test.testproc1 is not a variable or NEW pseudo-variable in BEFORE trigger
OUT と INOUT の引数では戻り値を受け取る必要がありますが、値を直接渡した場合は呼び出し側で戻り値を受け取ることができないので、このエラーが発生します。
このエラーが発生する場合、修正方法として考えられるのは以下の2つです。
引数に変数を渡すよう修正する。
1つ目の方法は、引数に値を直接渡すのではなく、引数が戻り値を受け取ることができるように変数を渡すよう修正する方法です。
尚、 MySQL のコマンドプロンプト上で変数を使用するには、先頭にアットマーク( @ )を付与します。
次の例では、変数 @var1 を testproc1 の引数に渡しています。INOUT の引数はプロシージャ呼出し時に変数にセットされた値を渡すだけでなく、処理の中で変数に戻り値をセットするので、ストアドプロシージャ呼出し後に変数を SELECT すると、戻り値としてセットされた値を確認することができます。
mysql> DELIMITER // mysql> CREATE PROCEDURE testproc1(INOUT prmInOut INT) -> BEGIN -> SET prmInOut = 1234 + prmInOut; -> END -> // Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ; mysql> SET @var1 = 1; Query OK, 0 rows affected (0.00 sec) mysql> CALL testproc1(@var1); Query OK, 0 rows affected (0.00 sec) mysql> SELECT @var1; +-------+ | @var1 | +-------+ | 1235 | +-------+ 1 row in set (0.00 sec)
引数を IN に修正する。
もし戻り値を受け取る必要がないのに、誤って OUT や INOUT を引数に設定してしまっている場合は、引数を IN に修正します。IN の引数であれば値を直接渡してもエラーにはなりません。
mysql> DELIMITER // mysql> CREATE PROCEDURE testproc1(IN prmInOut INT) -> BEGIN -> SET prmInOut = 1234 + prmInOut; -> END -> // Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ; mysql> CALL testproc1(1); Query OK, 0 rows affected (0.00 sec)