MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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パラメータを受け取るための@付きのユーザー定義変数を正しく指定すれば、「変数または新しい疑似変数ではありません」というエラーメッセージは発生しなくなります。

  1. 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コマン

  2. MySQLの構文エラーとは?予約済みキーワードでテーブルを作成する方法

    MySQLの予約済みキーワードによる構文エラーとはMySQLでは、テーブル名に予約済みキーワード(reserved keyword)を使用すると、そのままではSQL構文エラーが発生します。ここでは例として、「groups」という名前のテーブルを作成しようとした場合を見てみましょう。「groups」はMySQLの予約済みキーワードであるため、通常の記述方法ではテーブルを作成できません。エラーが発生するケース以下のように、予約語「groups」を使ってテーブルを作成しようとすると、ERROR 1064という構文エラーが出力されます。mysql> create table groups->