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
モード。初期値を渡すことができ、ストアドプロシージャはそれを変更でき、呼び出し元のアプリケーションに新しい値を返します。