mysql ストアド プロシージャの詳細な紹介 (コード例)

不言
リリース: 2019-02-27 13:42:44
転載
2902 人が閲覧しました

この記事では、mysql ストアド プロシージャの詳細な紹介 (コード例) を紹介します。必要な方は参考にしていただければ幸いです。

1. ストアド プロシージャとは何ですか?

将来の使用のために保存された 1 つ以上の MySQL ステートメントのコレクション。

ストアド プロシージャの概念は、コードのカプセル化とデータベースの SQL 言語レベルでの再利用です。

(関連する推奨事項: MySQL チュートリアル )

2. ストアド プロシージャを使用する理由

  1. カプセル化使いやすい単位で処理し、複雑な操作を簡素化します。

  2. エラーを防止し、データの一貫性を確保します。

  3. 変更管理への対応を簡素化します。 (対応するテーブル名、列名などを変更すると、対応するストアド プロシージャのコードが変更されます。使用する人は変更内容を知る必要はありません)

  4. パフォーマンスの向上

  5. #柔軟

  6. #一般的に、シンプル、安全、高パフォーマンスです
欠点:


    SQL ステートメントよりも記述が複雑です
  1. 権限の問題 (権限がない可能性があります。通常はストアド プロシージャを使用し、ストアド プロシージャを作成する権限がありません)
3. ストアド プロシージャを作成します。

CREATE  PROCEDURE productpricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage
FROM products;
END
ログイン後にコピー
注: コマンド ラインに入力された問題

mysql> delimiter //
mysql> CREATE PROCEDURE productpricing()
    -> BEGIN
    -> SELECT Avg(prod_price) AS priceaverage
    -> FROM products;
    -> END //
ログイン後にコピー

4. ストアド プロシージャを使用します。 #ストアド プロシージャは実際には関数です

CALL productpricing();
ログイン後にコピー

4. ストアド プロシージャを削除します

    drop procedure productpricing;
    drop procedure if EXISTS productpricing;
ログイン後にコピー

5. パラメータを使用します

通常、ストアド プロシージャは結果を表示しません。指定した変数に結果を返します。

Variable (変数) データを一時的に保存するために使用されるメモリ内の特定の場所。

CREATE PROCEDURE productpricing(
    OUT p1 DECIMAL(8,2),
    OUT ph DECIMAL(8,2),
    OUT pa DECIMAL(8,2)
)
BEGIN
SELECT MIN(prod_price)
INTO p1
FROM products;
SELECT MAX(prod_price)
INTO ph
FROM products;
SELECT avg(prod_price)
INTO pa
FROM products;
END;
ログイン後にコピー

キーワード OUT は、ストアド プロシージャから値を渡す (呼び出し元に返される) ために、対応するパラメーターが使用されることを示します。

MySQL は、IN (ストアド プロシージャに渡される)、
OUT (ここで使用されているストアド プロシージャから渡される)、

INOUT (ストアド プロシージャの内外に渡される) タイプのパラメータをサポートします。


変数名 すべての MySQL 変数は @ で始まる必要があります。

ストアド プロシージャの呼び出し

call productpricing(@pricelow,@pricehign,@priceaverage);
ログイン後にコピー

クエリ
SELECT @priceaverage;
ログイン後にコピー
SELECT @priceaverage,@pricehign,@pricelow;
ログイン後にコピー

内外での使用

作成

CREATE PROCEDURE ordertotal(
    IN onumber INT,
    OUT ototal DECIMAL(8,2)
)
BEGIN
SELECT sum(item_price*quantity)
FROM orderitems
WHERE order_num = onumber
INTO ototal;
END;
ログイン後にコピー
Calling
call ordertotal(20005,@total);
ログイン後にコピー

Query
select @total;
ログイン後にコピー

6. インテリジェントなストアド プロシージャの確立

これまでに使用したすべてのストアド プロシージャは、基本的にカプセル化された MySQL の単純な SELECT ステートメントです。これらはすべてストアド プロシージャの有効な例ですが、これらのカプセル化されたステートメントを直接使用してできることは実行できます (それ以上の効果があるとすれば、それは物事をより複雑にすることです)。ストアド プロシージャの威力は、ストアド プロシージャにビジネス ルールとインテリジェントな処理が含まれる場合にのみ真に明らかになります。

   考虑这个场景。你需要获得与以前一样的订单合计,但需要对合计增加营业税,不过只针对某些顾客(或许是你所在州中那些顾客)。那么,你需要做下面几件事情:
   1、获得合计(和以前一样)
   2、把营业税有条件的添加到合计
   3、返回合计(带或不带税的)
ログイン後にコピー

次のコードを入力します:

-- Name: ordertotal        //   添加注释
-- Parameters: onumber = order number
--             taxable = 0 if not taxable, 1 if taxtable
--             ototal = order total variable

CREATE     PROCEDURE ordertotal (
IN onumber INT,
IN taxable BOOLEAN,
OUT ototal DECIMAL(8,2)
) COMMENT 'Obtain order total, optionally adding tax'
BEGIN
    
        -- Declare variable for total
        DECLARE total DECIMAL(8,2);     //   声明变量   
        -- Declare tax percentage
        DECLARE taxrate INT DEFAULT 6;
        
        -- Get the order total
        SELECT Sum(item_price*quantity)
        FROM orderitems
        WHERE order_num = onumber
        INTO total;
        
        -- Is this taxable?
        IF taxable THEN
            -- yes,so add taxrate to the total
            SELECT total+(total/100*taxrate) INTO total;
        END IF;
        --  And finally, save to out variable
        SELECT total INTO ototal;
END;
ログイン後にコピー
此存储过程有很大的变动。首先,增加了注释(前面放置 --)。在存储过程复杂性增加时,这样做特别重要。  
添加了另外一个参数 taxable,它是一个布尔值(如果要增加税则为真,否则为假)。  
在存储过程体中,用 DECLARE语句定义了两个局部变量。 DECLARE要求指定变量名和数据类型,
它也支持可选的默认值(这个例子中的 taxrate的默认被设置为 6%)。SELECT 语句变,因此其结果存储到 total(局部变量)而不是 ototal。  
IF 语句检查taxable是否为真,如果为真,则用另一SELECT语句增加营业税到局部变量 total。

最后,用另一SELECT语句将total(它增加或许不增加营业税)保存到 ototal。  
注意:COMMENT关键字 ,本例子中的存储过程在 CREATE PROCEDURE语句中包含了一个 COMMENT值。  
它不是必需的,但如果给出,将在SHOW PROCEDURE STATUS的结果中显示。

这显然是一个更高级,功能更强的存储过程。为试验它,请用以下两条语句:  
第一条:
ログイン後にコピー
call ordertotal(20005, 0, @total);
SELECT @total;
ログイン後にコピー
输出:
ログイン後にコピー
ログイン後にコピー
+--------+
| @total |
+--------+
|  38.47 |
+--------+
ログイン後にコピー
第二条:
ログイン後にコピー
call ordertotal(20009, 1,@total);
SELECT @total;
ログイン後にコピー
输出:
ログイン後にコピー
ログイン後にコピー
+--------+
| @total |
+--------+
|  36.21 |
+--------+
ログイン後にコピー

この例では、MySQL の IF ステートメントの基本的な使用法を示します。 IF ステートメントは、ELSEIF 句と ELSE 句もサポートしています (前者は THEN 句も使用しますが、後者は使用しません)。 IF (および他のフロー制御ステートメント) の他の使用法については、今後の章で説明します。

7. ストアド プロシージャを確認します

ストアド プロシージャの作成に使用された CREATE ステートメントを表示するには

BOOLEAN值指定为1 表示真,指定为 0表示假(实际上,非零值都考虑为真,只有 0被视为假)。通过给中间的参数指定 0或1 ,可以有条件地将营业税加到订单合计上。
ログイン後にコピー

ストアド プロシージャに関する詳細情報 (いつ、誰によって作成されたかなど) を取得するにはリスト

show create PROCEDURE ordertotal;
ログイン後にコピー

たくさんのテーブルがあります。フィルタリングにはlikeを使用してください

show procedure status;
ログイン後にコピー

以上がmysql ストアド プロシージャの詳細な紹介 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート