この記事では、mysql ストアド プロシージャの詳細な紹介 (コード例) を紹介します。必要な方は参考にしていただければ幸いです。
1. ストアド プロシージャとは何ですか?
将来の使用のために保存された 1 つ以上の MySQL ステートメントのコレクション。
ストアド プロシージャの概念は、コードのカプセル化とデータベースの SQL 言語レベルでの再利用です。
(関連する推奨事項: MySQL チュートリアル )
2. ストアド プロシージャを使用する理由
カプセル化使いやすい単位で処理し、複雑な操作を簡素化します。
エラーを防止し、データの一貫性を確保します。
変更管理への対応を簡素化します。 (対応するテーブル名、列名などを変更すると、対応するストアド プロシージャのコードが変更されます。使用する人は変更内容を知る必要はありません)
パフォーマンスの向上
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();
drop procedure productpricing; drop procedure if EXISTS productpricing;
5. パラメータを使用します
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;
MySQL は、IN (ストアド プロシージャに渡される)、
OUT (ここで使用されているストアド プロシージャから渡される)、
変数名 すべての 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;
call ordertotal(20005,@total);
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 サイトの他の関連記事を参照してください。