SQL ストアドプロシージャ
1. ストアドプロシージャ(Stored Procedure)とは?
ストアドプロシージャとは、保存して再利用できる事前コンパイル(Precompiled)された SQL コードのことです。
何度も繰り返し記述するような SQL クエリがある場合、それをストアドプロシージャとして保存しておけば、次回からはそのプロシージャを呼び出すだけで実行可能になります。
また、ストアドプロシージャにはパラメータ(Parameters)を渡すことができるため、渡されたパラメータ値に基づいて動的に処理を行うことができます。
2. ストアドプロシージャの主なメリット
ストアドプロシージャはデータベース管理において広く利用されており、以下のようなメリットがあります。
- コードの再利用性(Code Reusability): 同じプロシージャをさまざまなアプリケーションから呼び出すことができます。
- パフォーマンスの向上(Improved Performance): ストアドプロシージャは事前コンパイルされているため、実行速度が向上します。
- データベースのセキュリティ(Database Security): 特定のプロシージャを実行する権限をユーザーに設定できるため、テーブルへの直接的なアクセスを制限できます。
- メンテナンスの容易さ(Easy Maintenance): プロシージャを更新するだけで、それを利用しているすべての箇所に自動的に変更が反映されます。
3. ストアドプロシージャの構文 (SQL Server)
ストアドプロシージャを作成するには、CREATE PROCEDURE 文を使用します。
CREATE PROCEDURE プロシージャ名
@パラメータ1 データ型,
@パラメータ2 データ型
AS
BEGIN
-- 実行される SQL ステートメント
SELECT カラム1, カラム2
FROM テーブル名
WHERE カラムN = @パラメータN;
END;Tips: MySQL データベースの構文については、「MySQL Stored Procedures」を参照してください。
4. ストアドプロシージャの実行
ストアドプロシージャを実行するには、EXEC 文を使用します。
EXEC プロシージャ名 @パラメータ1 = '値1', @パラメータ2 = '値2';5. ストアドプロシージャの削除
ストアドプロシージャを削除するには、DROP PROCEDURE 文を使用します。
DROP PROCEDURE プロシージャ名;Tips: プロシージャが存在しない場合にエラーが返されないようにするには、IF EXISTS 句を追加します。DROP PROCEDURE IF EXISTS プロシージャ名;
6. デモ用データベース
以下は、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 |
7. ストアドプロシージャの使用例
次の SQL は、「Customers」テーブルから特定の「City(市区町村)」の顧客を選択するために使用できる、GetCustomersByCity という名前のストアドプロシージャを作成します。
作成例:
CREATE PROCEDURE GetCustomersByCity
@City nvarchar(50)
AS
BEGIN
SELECT * FROM Customers
WHERE City = @City;
END;次に、このストアドプロシージャにパラメータとして都市名('London')を渡して実行します。プロシージャは「Customers」テーブルから該当する詳細情報を返します。
実行例:
EXEC GetCustomersByCity @City = 'London';8. 複数パラメータを持つストアドプロシージャ
複数のパラメータを追加するのも簡単です。以下のように、各パラメータとそのデータ型をカンマで区切って記述します。
次の SQL は、「Customers」テーブルから「特定の City(市区町村)」かつ「特定の PostalCode(郵便番号)」の顧客を選択するストアドプロシージャを作成します。
作成例:
CREATE PROCEDURE GetCustomersByCity
@City nvarchar(50),
@PostalCode nvarchar(10)
AS
BEGIN
SELECT * FROM Customers
WHERE City = @City AND PostalCode = @PostalCode;
END;作成したストアドプロシージャを以下のように実行します。
実行例:
EXEC GetCustomersByCity @City = 'London', @PostalCode = 'WA1 1DP';