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(顧客)」テーブルからの抜粋です。
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
| 3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
| 4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
| 5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
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');