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

MySQLストアドプロシージャでINOUTパラメータを使う方法を実例付きで解説

INOUTパラメータとは

MySQLのストアドプロシージャでは、パラメータに「IN」「OUT」「INOUT」の3種類を指定できます。このうちINOUTパラメータは、プロシージャに値を受け渡すと同時に、処理結果の値を呼び出し元へ返すことができる、入出力両方の役割を持つパラメータです。

以下に、INOUTパラメータを使用したMySQLストアドプロシージャの具体的な作成例を示します。

INOUTパラメータを持つストアドプロシージャの作成例

mysql> DELIMITER // ;
mysql> Create PROCEDURE counter(INOUT count INT, IN increment INT)
    -> BEGIN
    -> SET count = count + increment;
    -> END //
Query OK, 0 rows affected (0.03 sec)

この例では、2つのパラメータを使用しています。

  • count(INOUTパラメータ):値を受け取り、加算後の値を呼び出し元に返します。
  • increment(INパラメータ):ユーザーから受け取った増分値を保持するだけの入力用パラメータです。

ストアドプロシージャの実行方法

作成したプロシージャは、ユーザー定義変数(@変数)を使って呼び出します。まず初期値として0を設定した変数を準備し、CALL文でプロシージャを実行してみましょう。

mysql> DELIMITER ;
mysql> SET @counter = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> CALL counter(@Counter, 1);
Query OK, 0 rows affected (0.00 sec)

mysql> Select @Counter;
+----------+
| @Counter |
+----------+
| 1        |
+----------+
1 row in set (0.00 sec)

最初の呼び出しでは、初期値0に対して1が加算され、@Counter の値は「1」になっています。

続けて、別の値を指定してもう一度呼び出してみます。

mysql> CALL counter(@Counter, 5);
Query OK, 0 rows affected (0.00 sec)

mysql> Select @Counter;
+----------+
| @Counter |
+----------+
| 6        |
+----------+
1 row in set (0.00 sec)

今度は前回の結果である1に対して5が加算され、@Counter の値は「6」になりました。

まとめ

このようにINOUTパラメータを使うと、変数の現在値をプロシージャ内で参照・更新しながら、その結果をそのまま呼び出し元に反映できます。カウンタや累積計算など、状態を保持しながら繰り返し処理を行いたい場合に特に便利な機能です。

  1. 【MySQL入門】RIGHT JOINを使ってビュー(VIEW)を作成する方法を実例付きで解説

    MySQLでは、RIGHT JOIN(右外部結合)を使用したSELECT文からもビュー(VIEW)を作成できます。本記事では、「Customers」テーブルと「Reserve」テーブルのデータを例に、RIGHT JOINによるビュー作成の手順を具体的に解説します。 使用するサンプルデータ まず、例として使用する2つのテーブルの内容を確認しておきましょう。「Customers」には顧客情報が、「Reserve」には車の予約履歴が格納されています。 mysql> Select * from Customers; +-------------+----------+ | Customer_

  2. MySQLのDELIMITER(区切り文字)を使ってストアドプロシージャを作成・実行する方法

    MySQLでは、CREATE PROCEDUREコマンドを使用することでストアドプロシージャを作成できます。ストアドプロシージャの中には複数のSQL文が含まれますが、そのまま定義すると文の区切りを示すセミコロン(;)がプロシージャ本体の途中で解釈されてしまいます。そこで、一時的に区切り文字を変更する必要があります。 基本的な構文 delimiter // CREATE PROCEDURE yourStoreProcedureName() BEGIN -- ここで変数を宣言します -- クエリ文を記述します END // delimiter ; ストアドプロシージャの作成例 上