MySQLのストアドプロシージャで発生する「変数または新しい疑似変数ではありません」エラーの原因と解決方法
MySQLでストアドプロシージャを扱う際に、「Not a variable or NEW pseudo-variable(変数または新しい疑似変数ではありません)」というエラーメッセージに遭遇することがあります。このエラーは、主にOUTパラメータを持つストアドプロシージャを呼び出す際に、ユーザー定義変数を正しく指定していないことが原因で発生します。
エラーを解消するための基本概念
このエラーを回避するには、ストアドプロシージャから値を受け取るためにユーザー定義変数を使用します。ユーザー定義変数は、変数名の先頭に@記号を付けるのが特徴です。
ストアドプロシージャを呼び出す際の基本的な構文は以下の通りです。
CALL yourStoredProcedureName(yourParameter1, yourParameter2, ..., N, @yourVariableName);
変数に格納された値を確認するには、SELECT文を使用します。
SELECT @yourVariableName;
サンプルテーブルの作成とデータ挿入
上記の構文を実際に理解するために、まずテーブルを作成し、いくつかのレコードを挿入してみましょう。
テーブルを作成するクエリは以下の通りです。
mysql> create table StoredProcedureDemo
-> (
-> Id int,
-> Name varchar(10)
-> );
Query OK, 0 rows affected (1.20 sec)
次に、INSERTコマンドを使ってレコードを挿入します。
mysql> insert into StoredProcedureDemo values(1,'John'); Query OK, 1 row affected (0.31 sec) mysql> insert into StoredProcedureDemo values(2,'Carol'); Query OK, 1 row affected (0.19 sec)
SELECT文ですべてのレコードを表示して確認しましょう。
mysql> select *from StoredProcedureDemo;
実行結果は以下の通りです。
+------+-------+ | Id | Name | +------+-------+ | 1 | John | | 2 | Carol | +------+-------+ 2 rows in set (0.00 sec)
値を返すストアドプロシージャの作成
ここで、OUTパラメータによって値を返すストアドプロシージャを作成します。作成用のクエリは以下の通りです。
mysql> DELIMITER //
mysql> create procedure Update_table(IN Id int, IN Name VARCHAR(20),OUT message VARCHAR(50))
-> BEGIN
-> set message= 'DATABASE HAS BEEN UPDATED';
-> INSERT INTO StoredProcedureDemo
-> values (Id, Name);
-> end;
-> //
Query OK, 0 rows affected (0.67 sec)
mysql> DELIMITER ;
このプロシージャは、INパラメータとしてIdとNameを受け取り、OUTパラメータのmessageに完了メッセージを設定した後、テーブルに新しいレコードを挿入します。
ストアドプロシージャの呼び出しと変数の確認
それでは、実際の値を渡してストアドプロシージャを呼び出してみましょう。ポイントは、3番目の引数として@UserMessageというユーザー定義変数を指定することです。
mysql> call Update_table(3,'Larry',@UserMessage); Query OK, 1 row affected (0.13 sec)
SELECT文で@UserMessageの値を確認します。
mysql> select @UserMessage;
実行結果は以下の通りです。
+---------------------------+ | @UserMessage | +---------------------------+ | DATABASE HAS BEEN UPDATED | +---------------------------+ 1 row in set (0.00 sec)
OUTパラメータの値が正しく変数に格納されていることがわかります。
テーブルへの反映の確認
最後に、テーブルのレコードを再度確認してみましょう。
mysql> select *from StoredProcedureDemo;
実行結果は以下の通りです。
+------+-------+ | Id | Name | +------+-------+ | 1 | John | | 2 | Carol | | 3 | Larry | +------+-------+ 3 rows in set (0.00 sec)
出力結果を見ると、Idが3の新しいレコードが正常に挿入されていることが確認できます。このように、ストアドプロシージャ呼び出し時にOUTパラメータを受け取るための@付きのユーザー定義変数を正しく指定すれば、「変数または新しい疑似変数ではありません」というエラーメッセージは発生しなくなります。
-
MySQLストアドプロシージャ内で動的SQLクエリを実装する方法
ストアドプロシージャ内で動的SQLクエリを実行するには、PREPARE STATEMENT(プリペアドステートメント)の仕組みを利用します。まずはサンプル用のテーブルを作成しましょう。1. テーブルの作成mysql> create table DemoTable2033 -> ( -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> Name varchar(20) -> ); Query OK, 0 rows affected (1.61 sec)2. レコードの挿入INSERTコマン
-
MySQLの構文エラーとは?予約済みキーワードでテーブルを作成する方法
MySQLの予約済みキーワードによる構文エラーとはMySQLでは、テーブル名に予約済みキーワード(reserved keyword)を使用すると、そのままではSQL構文エラーが発生します。ここでは例として、「groups」という名前のテーブルを作成しようとした場合を見てみましょう。「groups」はMySQLの予約済みキーワードであるため、通常の記述方法ではテーブルを作成できません。エラーが発生するケース以下のように、予約語「groups」を使ってテーブルを作成しようとすると、ERROR 1064という構文エラーが出力されます。mysql> create table groups->