sql >> データベース >  >> RDS >> Mysql

MySQLストアドプロシージャ

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

    1. SQLServerテーブルのスキーマとデータを比較するさまざまな方法

    2. MySQLタイムゾーン

    3. <text>を含むストアドプロシージャを見つけるにはどうすればよいですか?

    4. T-SQLの中括弧