ストアドプロシージャは、MySQLデータベースに格納され、特定のデータベース操作を実行するためにオンデマンドで実行されるユーザー定義のSQLステートメントです。これらの事前定義されたサブルーチンは、ビジネスロジックをデータベースに移動するのに役立ちます。これにはいくつかの利点があります。
- アプリケーションによるデータベースサーバーへのラウンドトリップは最小限に抑えられます。
- さまざまなアプリケーションがストアドプロシージャを共有できるため、コードの保守性が向上します。
- ストアドプロシージャが一度コンパイルされ、非常に迅速かつ効率的に実行されるため、データベースのパフォーマンスが向上します。
このガイドでは、次のことを行います。
-
ストアドプロシージャを作成するための構文を学び、最初のプロシージャを宣言します。
-
宣言した後、サンプル手順を実行します。
-
不要になったプロシージャを削除する方法を学びます。
始める前に
次のものがあることを確認してください:
-
まだ行っていない場合は、Linodeアカウントとコンピュートインスタンスを作成します。 Linode入門とコンピューティングインスタンスの作成ガイドをご覧ください。
-
コンピューティングインスタンスのセットアップと保護ガイドに従って、システムを更新してください。また、タイムゾーンを設定し、ホスト名を構成し、制限付きユーザーアカウントを作成し、SSHアクセスを強化することもできます。
-
LinodeサーバーにインストールされたMySQLサーバーとクライアント。 MySQLのインストールガイドは、MySQLセクションのさまざまなディストリビューションで利用できます。
データベースを準備する
まず、データベースにアクセスするためのサンプルデータベース、テーブル、およびユーザーを作成します。また、テスト用にサンプルデータをテーブルに入力します。
データベース、テーブル、およびユーザーの作成
-
MySQLサーバーにログインします:
mysql -u root -p
MySQLデータベースのrootパスワードを入力するように求められます。次に、 Enterを押します 続行します。
-
次に、以下に示すようなMySQLプロンプトが表示されます。
mysql >
-
以下のコマンドを入力して、
test_db
を作成します データベース:CREATE DATABASE test_db;
出力:
Query OK, 1 row affected (0.01 sec)
-
データベースユーザーを作成し、
test_db
へのフルアクセスを許可します データベース。PASSWORD
を置き換えます MySQLパスワードのガイドラインに従う複雑で一意の値を使用する:CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
出力:
Query OK, 1 row affected (0.01 sec)
-
test_user
を付与しますtest_db
への完全な権限 データベース;GRANT ALL PRIVILEGES ON test_db.* TO 'test_user'@'localhost';
出力:
Query OK, 1 row affected (0.01 sec)
-
フラッシュ特権:
FLUSH PRIVILEGES;
出力:
Query OK, 0 rows affected (0.01 sec)
データベースにデータを入力する
-
次に、test_dbデータベースに切り替えます。
USE test_db;
出力:
Database changed
-
products
を作成します サンプルレコードを保存するテーブル:CREATE TABLE products(product_id BIGINT PRIMARY KEY, product_name VARCHAR(50), category_name VARCHAR(50) ) ENGINE=INNODB;
出力:
Query OK, 0 rows affected (0.01 sec)
-
以下のコマンドを1つずつ実行することで、製品テーブルにいくつかの製品を追加できるようになりました。
INSERT INTO products (product_id, product_name, category_name) VALUES ('1', 'GAMING KEYBOARD', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('2', 'OPTICAL MOUSE', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('3', 'MOUSE PAD', 'COMPUTER ACCESSORIES'); INSERT INTO products (product_id, product_name, category_name) VALUES ('4', 'STEREO SYSTEM', 'ELECTRONICS'); INSERT INTO products (product_id, product_name, category_name) VALUES ('5', '32 INCH TV', 'ELECTRONICS'); INSERT INTO products (product_id, product_name, category_name) VALUES ('6', 'DVB-T2 RECEIVER', 'ELECTRONICS');
各
Insert
を実行すると、次の出力が得られます。 ステートメント:Query OK, 1 row affected (0.00 sec)
-
次。
Select
を実行して、サンプル製品がデータベースに正常に挿入されたかどうかを確認します 以下のコマンド:SELECT * FROM products;
サンプル製品は次のようにリストされているはずです:
+------------+-----------------+----------------------+ | product_id | product_name | category_name | +------------+-----------------+----------------------+ | 1 | GAMING KEYBOARD | COMPUTER ACCESSORIES | | 2 | OPTICAL MOUSE | COMPUTER ACCESSORIES | | 3 | MOUSE PAD | COMPUTER ACCESSORIES | | 4 | STEREO SYSTEM | ELECTRONICS | | 5 | 32 INCH TV | ELECTRONICS | | 6 | DVB-T2 RECEIVER | ELECTRONICS | +------------+-----------------+----------------------+ 6 rows in set (0.00 sec)
-
MySQLサーバーを終了します。
QUIT;
出力:
Bye!
-
test_db
を作成したら データベース、products
テーブル、test_user
、およびいくつかのサンプル製品を追加すると、最初のストアドプロシージャの作成に進むことができます。
ストアドプロシージャの作成
MySQLデータベースでストアドプロシージャを作成する基本的な構文を以下に示します。
DELIMITER &&
CREATE PROCEDURE PROCEDURE_NAME (PARAMETER_1, PARAMETER_2, PARAMETER_N...)
BEGIN
[SQL STATEMENT]
END &&
DELIMITER ;
-
DELIMITER &&
最初の行は、次のSQLステートメントを個別に実行するのではなく、単一のステートメントとして扱うようにMySQLサーバーに指示します。別の&&
このステートメントの終わりを示すために、後の行に含まれています。 -
PROCEDURE_NAME
ストアドプロシージャの名前が宣言されている場所です。 -
プロシージャ名の後には一連の括弧が続き、これらはパラメータをプロシージャに囲みます。ストアドプロシージャはコンマ区切りのパラメータをサポートしており、この機能により柔軟性が高まります。詳細については、パラメータのセクションをご覧ください。
-
BEGIN...END
コマンドは、ストアドプロシージャによって実行されるSQLステートメントを囲みます。 -
最後に、ステートメント
DELIMITER ;
区切り文字をデフォルト値の;
に戻すために、が再度発行されます。
ストアドプロシージャパラメータ
プロシージャの各パラメータには、スペースで区切られたタイプ、名前、およびデータ型があります。
PARAMETER_TYPE PARAMETER_NAME DATA_TYPE
たとえば、タイプIN
のパラメータを作成するには 、category
という名前 、VARCHAR
を使用 50の長さのデータ型 文字、次の構文を使用します:
IN category VARCHAR(50)
MySQLは次の3種類のパラメータをサポートしています。
-
IN
:パラメータの値は、呼び出し元のクライアントが指定する必要があります。 この値はストアドプロシージャでは変更できません 。たとえば、MySQLセッション変数を
IN
として渡す場合 プロシージャへのパラメータであり、プロシージャがステートメント内のこの値を変更する場合、セッション変数は、プロシージャが終了した後も変更されないままになります。 -
OUT
:このタイプのパラメーターも呼び出し側プログラムによって指定されますが、その値はストアード・プロシージャーによって変更され、呼び出し側プログラムによって取得されます。ストアドプロシージャは、
OUT
として渡される変数の初期値にアクセスできないことに注意してください。 パラメータ。 -
INOUT
:このタイプのパラメータは、IN
の動作を組み合わせたものです およびOUT
パラメータ:-
ストアドプロシージャは、パラメータの初期値を読み取ることができます。
-
パラメータは、ストアドプロシージャの実行中に変更できます。
-
呼び出し側プログラムがパラメーターとして変数を渡した場合、変更された値を呼び出し側プログラムに戻すことができます。
-
ストアドプロシージャの例
基本的な構文を理解したら、カテゴリ名で製品をフィルタリングするための簡単なストアドプロシージャを作成しましょう。カテゴリ名はIN
として提供されます パラメータ。
-
test_user
を使用してMySQLサーバーにログインします データベースの準備時に作成したのクレデンシャル:mysql -u test_user -p
-
test_user
のパスワードを入力してください Enterを押します 続行します。 -
mysql >
を取得します 促す。test_db
を選択して続行します :USE test_db;
出力:
Database changed.
-
次に、以下のSQLコマンドを入力して、
filter_by_category
を作成します。 ストアドプロシージャ:DELIMITER && CREATE PROCEDURE filter_by_category (IN category VARCHAR(50)) BEGIN SELECT * FROM products WHERE category_name=category; END &&
出力:
Query OK, 0 rows affected (0.00 sec)
-
DELIMITER
を変更します;
に戻るDELIMITER ;
-
ストアドプロシージャを作成するためのコードが正常に実行された場合は、ストアドプロシージャの実行に進むことができます。
ストアドプロシージャの実行
このステップでは、上記で作成したストアドプロシージャを呼び出します。この基本的な構文に従います:
CALL PROCEDURE_NAME (COMMA-SEPARATED PARAMETER VALUES);
-
filter_by_category
を実行するには 上で作成したストアドプロシージャの場合は、次のコマンドを入力します。CALL filter_by_category('COMPUTER ACCESSORIES');
ストアドプロシージャは、すべての製品を
COMPUTER ACCESSORIES
に出力するはずです。COMPUTER ACCESSORIES
を指定したためカテゴリ パラメータとして:+------------+-----------------+----------------------+ | product_id | product_name | category_name | +------------+-----------------+----------------------+ | 1 | GAMING KEYBOARD | COMPUTER ACCESSORIES | | 2 | OPTICAL MOUSE | COMPUTER ACCESSORIES | | 3 | MOUSE PAD | COMPUTER ACCESSORIES | +------------+-----------------+----------------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
-
同様に、
ELECTRONICS
からすべての製品のリストを取得できます。 以下のコマンドを実行してカテゴリを作成します。CALL filter_by_category('ELECTRONICS') ;
出力:
+------------+-----------------+---------------+ | product_id | product_name | category_name | +------------+-----------------+---------------+ | 4 | STEREO SYSTEM | ELECTRONICS | | 5 | 32 INCH TV | ELECTRONICS | | 6 | DVB-T2 RECEIVER | ELECTRONICS | +------------+-----------------+---------------+ 3 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
ストアドプロシージャは期待どおりに機能しました。次に、ストアドプロシージャを再度実行する必要がなくなった場合に、それらを削除する方法を学習します。
ストアドプロシージャの削除
MySQLストアドプロシージャを使用する必要がなくなった場合、または最初から再作成する場合は、MySQLストアドプロシージャを削除できます。ストアドプロシージャを削除する基本的な構文を以下に示します。
DROP PROCEDURE IF EXISTS PROCEDURE_NAME;
たとえば、filter_by_category
を削除するには ストアドプロシージャの場合は、以下のMySQLコマンドを実行します。
DROP PROCEDURE IF EXISTS filter_by_category;
ストアドプロシージャが存在する場合は、次のような出力が得られます。
Query OK, 0 rows affected (0.00 sec)
MySQLストアドプロシージャの作成、使用、および削除に関しては、これですべてです。
詳細情報
このトピックの詳細については、次のリソースを参照してください。これらは有用であることを期待して提供されていますが、外部でホストされている資料の正確性や適時性を保証することはできません。
- MySQLストアドプロシージャの操作