MySQL 速習チュートリアル

MySQL ストアドプロシージャ

1. ストアドプロシージャとは?

ストアドプロシージャ(Stored Procedure)は、保存して再利用できるプリコンパイル(事前コンパイル)済みのSQLコードです。

何度も繰り返し記述するようなSQLクエリがある場合、それをストアドプロシージャとして保存しておけば、次回からはそのプロシージャを呼び出すだけで実行可能になります。

また、ストアドプロシージャにはパラメータ(引数)を渡すことができるため、渡された値に基づいて動的に処理を切り替えるといった、関数のような柔軟な動作も可能です。

1.1 ストアドプロシージャの主なメリット

データベース管理においてストアドプロシージャが広く利用されているのには、以下の理由があります:

  • コードの再利用性: 同一のプロシージャを複数のアプリケーションから呼び出して共有できます。
  • パフォーマンスの向上: プリコンパイルされているため、通常のSQLクエリを都度発行するよりも高速に動作します。
  • データベースのセキュリティ: ユーザーに対して特定のプロシージャの実行権限のみを付与することで、テーブルへの直接アクセスを制限できます。
  • メンテナンスの容易性: プロシージャを一度更新すれば、それを利用しているすべての箇所に自動的に変更が反映されます。

2. ストアドプロシージャの構文

MySQLでプロシージャを定義する際の基本構文です。

DELIMITER //

CREATE PROCEDURE プロシージャ名
  @パラメータ1 データ型,
  @パラメータ2 データ型
BEGIN
  -- 実行されるSQLステートメント
  SELECT カラム1, カラム2
  FROM テーブル名
  WHERE カラムN = @パラメータN;
END //

DELIMITER ;

3. ストアドプロシージャの実行

定義したストアドプロシージャを実行するには、CALL ステートメントを使用します。

-- プロシージャを呼び出して実行します
CALL プロシージャ名('値1', '値2');

4. ストアドプロシージャの削除

不要になったストアドプロシージャを削除するには、DROP PROCEDURE ステートメントを使用します。

DROP PROCEDURE プロシージャ名;

Tips: プロシージャが存在しない場合にエラーが出るのを防ぐには、IF EXISTS 句を追加するのがベストプラクティスです。
DROP PROCEDURE IF EXISTS プロシージャ名;

5. デモ用データベース

本チュートリアルでは、お馴染みの Northwind サンプルデータベースを使用します。
以下は「Customers(顧客)」テーブルからの抜粋です。

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico
4Around the HornThomas Hardy120 Hanover Sq.LondonWA1 1DPUK
5Berglunds snabbköpChristina BerglundBerguvsvägen 8LuleåS-958 22Sweden

6. ストアドプロシージャの作成例

次の SQL は、GetCustomersByCity という名前のストアドプロシージャを作成します。これは「Customers」テーブルから特定の都市(City)の顧客を選択するために使用されます。

DELIMITER //

-- 特定の都市の顧客を抽出するプロシージャ
CREATE PROCEDURE GetCustomersByCity
  @City VARCHAR(50)
BEGIN
  SELECT * FROM Customers
  WHERE City = @City;
END //

DELIMITER ;

このプロシージャにパラメータとして都市名('London')を渡して実行すると、該当する顧客データが返されます。

-- ロンドンの顧客を取得します
CALL GetCustomersByCity('London');

7. 複数パラメータを使用する例

複数のパラメータを追加するのも簡単です。以下のように、各パラメータとデータ型をカンマで区切ってリストアップするだけです。

次の SQL は、特定の都市(City)かつ特定の郵便番号(PostalCode)を持つ顧客を選択するプロシージャを作成します。

DELIMITER //

-- 都市と郵便番号を条件に顧客を抽出するプロシージャ
CREATE PROCEDURE GetCustomersByCity
  @City VARCHAR(50),
  @PostalCode VARCHAR(10)
BEGIN
  SELECT * FROM Customers
  WHERE City = @City AND PostalCode = @PostalCode;
END //

DELIMITER ;

作成したプロシージャは次のように呼び出します。

-- 都市 'London'、郵便番号 'WA1 1DP' の顧客を実行結果として取得
CALL GetCustomersByCity('London', 'WA1 1DP');