MySQLには、ストアドプロシージャを作成する機能があります。 。ストアドプロシージャは、MySQL(およびSQL Serverなどの他のデータベース管理システム)の強力な部分であり、ビューよりも多くのことを実行できます。
ストアドプロシージャ データベースに格納されているSQLステートメントのコレクションです。ストアドプロシージャには、ストアドプロシージャとビューを区別する重要な側面の1つであるビジネスロジックを含めることができます。ストアドプロシージャはパラメータを受け入れることができ、変数を設定したり、IFを記述したりできます。 ストアドプロシージャ内のステートメントなど。
ストアドプロシージャはどのように機能しますか?
まず、ストアドプロシージャを作成します。作成したら、実行できます(より正確には、「呼び出す」ことができます)。
ストアドプロシージャを実行するには、それを「呼び出し」ます。これを呼び出すときは、必要になる可能性のあるパラメーターも指定します。ストアドプロシージャは、コードで指定されている方法でパラメータを使用して実行されます。
たとえば、FruitIdを受け入れるストアドプロシージャを作成できます。 パラメータ。ストアドプロシージャは、そのパラメータを取得し、それを使用してその特定の果物の在庫を確認できます。したがって、毎回異なるフルーツIDを使用してストアドプロシージャを呼び出すと、そのフルーツの在庫量を示す値が返されます。
ストアドプロシージャを作成する
ストアドプロシージャは、CREATE PROCEDUREを使用して作成されます ステートメント。
構文
ストアドプロシージャを作成するための構文は次のとおりです。
CREATE PROCEDURE sp_name(p_1 INT) BEGIN ...code goes here... END;
sp_name を置き換えます ストアドプロシージャに使用する名前を付けてください。括弧は必須です—パラメーターを囲みます。パラメーターが不要な場合は、括弧を空にすることができます。
ストアドプロシージャの本体は、BEGINの間にあります。 およびEND キーワード。これらのキーワードは、複合ステートメントを作成するために使用されます。複合ステートメントには複数のステートメントを含めることができ、必要に応じてこれらをネストできます。したがって、BEGINをネストできます およびEND ブロック。
ほとんどの場合、CREATE PROCEDUREも囲む必要があります DELIMITERを含むステートメント コマンドと変更END; END //へ 。このように:
DELIMITER // CREATE PROCEDURE sp_name(p_1 INT) BEGIN ...code goes here... END // DELIMITER ;
理由はすぐに説明しますが、とりあえず例を見てみましょう。
例
ストアドプロシージャを作成する簡単な例を次に示します。 FruitShop に対して次のコードを実行する データベースは、 spCheckFruitStock というストアドプロシージャを作成します :
DELIMITER // CREATE PROCEDURE spCheckFruitStock(thisFruit SMALLINT) BEGIN SELECT Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = thisFruit; END // DELIMITER ;
これで、次のようにそのストアドプロシージャを呼び出すことができます:
CALL spCheckFruitStock(1);
ここでは、1のパラメータを渡します これは
Apple
のIDです 。
結果は次のとおりです。
ストアドプロシージャに渡されるパラメータを変更するだけで、データベース内のどのフルーツに対しても同じことができます。
DELIMITERについて コマンド
上記の例では、いくつかのDELIMITERを追加しました コマンドを実行し、セミコロンを2つのスラッシュに置き換えました。ここで何が起こっているのですか?
これは、ストアドプロシージャの作成中に別の区切り文字を使用するようにMySQLに指示するために行いました。
この理由は、MySQLはすでにセミコロンを各SQLステートメントの終わりをマークするための区切り文字として認識しているためです。したがって、MySQLが最初のセミコロンを認識するとすぐに、区切り文字をそのように解釈し、ストアドプロシージャが機能しなくなります。
DELIMITER コマンドを使用すると、MySQLに別の区切り文字を使用するように指示できます。上記の例では、これを2つのスラッシュ(//)に設定しています。 )しかし、これは何でもかまいません(ただし、バックスラッシュの使用は避けてください(\ )それはMySQLのエスケープ文字です)。区切り文字を変更することにより、MySQLはセミコロンをステートメントの終わりとして解釈しようとはしません。2つのスラッシュが表示されるまで待機します。
ストアドプロシージャを作成したら、DELIMITER ;を使用できます。 区切り文字をセミコロンにリセットします。
ストアドプロシージャの削除
DROP PROCEDUREを使用して、ストアドプロシージャを削除できます。 声明。このように:
DROP PROCEDURE spCheckFruitStock;
ストアドプロシージャの変更
一部を変更できます ALTER PROCEDUREを使用したストアドプロシージャの側面 声明。
ただし、ストアード・プロシージャーの本体またはそのパラメーターのいずれかを変更するには、プロシージャーをドロップして再作成する必要があります。このように:
DROP PROCEDURE IF EXISTS spCheckFruitStock; DELIMITER // CREATE PROCEDURE spCheckFruitStock(thisFruit SMALLINT) BEGIN SELECT Fruit.FruitId, Fruit.FruitName, Fruit.Inventory, Units.UnitName FROM Fruit INNER JOIN Units ON Fruit.UnitId = Units.UnitId WHERE Fruit.FruitId = thisFruit; END // DELIMITER ;
ここでは、Fruit.FruitIdを追加しました 返す列のリストに移動します。
結果:
より高度なストアドプロシージャ
上記の例は、ストアドプロシージャの作成と呼び出しの構文を示すための単純な例です。もう少し複雑なストアドプロシージャを見てみましょう:
DROP PROCEDURE IF EXISTS spCheckFruitStockLevel;
DELIMITER //
CREATE PROCEDURE spCheckFruitStockLevel(
IN pFruitId SMALLINT(5),
OUT pStockLevel VARCHAR(6))
BEGIN
DECLARE stockNumber SMALLINT;
SELECT
Fruit.Inventory into stockNumber
FROM
Fruit INNER JOIN Units ON
Fruit.UnitId = Units.UnitId
WHERE
Fruit.FruitId = pFruitId;
IF stockNumber > 10 THEN
SET pStockLevel = 'High';
ELSEIF (stockNumber <= 10 AND stockNumber >= 5) THEN
SET pStockLevel = 'Medium';
ELSEIF (stockNumber < 5) THEN
SET pStockLevel = 'Low - Please Replace Now!';
END IF;
END //
DELIMITER ;
上記の例では、2つの異なるモードのパラメーター(IN)を受け入れます。 およびOUT )。 IN がデフォルトであるため、前の例にモードが含まれていなかったのはこのためです。
ここでは、変数も設定します。 DECLARE stockNumber SMALLINTを使用します stockNumberという変数を宣言します タイプがSMALLINT (小整数)。
SELECTを使用します 指定されたフルーツIDの在庫を検索し、それをstockNumberに割り当てるステートメント 変数。
最後に、SQL IFを使用します 在庫レベルを決定するステートメント。この値をpStockLevelに配置します。 パラメータ(もちろんOUT パラメータ—これはストアドプロシージャを呼び出すときに表示される値です。
OUTを使用したストアドプロシージャの呼び出し またはINOUT パラメータ
最後の例では、INという2つのパラメーターを指定しました。 パラメータとOUT パラメータ。
このストアドプロシージャを呼び出すときは、OUTを含める必要があります。 パラメータ。ただし、その値がわからないため(結局のところ、それを呼び出しているのはその値を見つけるためです!)、変数を使用する必要があります。次に、SELECTを使用できます その価値を見つけるための声明。
このように:
CALL spCheckFruitStockLevel(1, @stockLevel); select @stockLevel;
結果:
パラメータモード
2つのパラメータモード(IN)を使用しました およびOUT )。 MySQLには、ストアドプロシージャで使用できる3つのパラメータモードがあります。
- IN
- このパラメータモードを使用する場合、ストアドプロシージャを呼び出すときに、ユーザー(またはアプリケーション)がパラメータの値を渡す必要があります。これらのパラメータは保護されています。したがって、ストアドプロシージャが実行された後も、元の値が保持されます。ストアドプロシージャが値を変更する場合は、パラメータのコピーに対してのみ変更されます。
このモードがデフォルトのモードです。パラメータモードを指定しない場合は、
INになります 。 - OUT
-
OUTの値 パラメータはストアドプロシージャ内で変更でき、その値は呼び出し元のアプリケーションに返されます。 - INOUT
- このモードは
INの組み合わせです およびOUTモード。初期値を渡すことができ、ストアドプロシージャはそれを変更でき、呼び出し元のアプリケーションに新しい値を返します。