MYSQL ストアド プロシージャとストアド関数の使用方法

WBOY
リリース: 2023-06-03 16:55:21
転載
1005 人が閲覧しました

1. ストアド プロシージャとストアド ファンクションとは

  • ストアド プロシージャ (ストアド プロシージャ) は、データベースに保存される SQL ステートメントの集合です。ビジネス ロジックをカプセル化することにより、ストアド プロシージャはデータベースの実行効率とデータ アクセスのセキュリティを向上させることができます。

  • ストアド ファンクション (ストアド ファンクション) は、データベースに保存された実行された一連の SQL ステートメントを指します。ストアド プロシージャとの違いは、ストアド ファンクションが戻り値を持つことです。

2. ストアド プロシージャ

CREATE PROCEDURE procedure_name([IN/OUT] parameter_name data_type)
BEGIN
    SQL Statement;
END;
ログイン後にコピー

を作成する employee という名前の従業員テーブルがすでにあり、ストアド プロシージャを作成する必要があるとします。 , 従業員の役職番号に基づいて従業員の名前と給与をクエリできます:

DELIMITER //
CREATE PROCEDURE get_employee_info_by_id(IN emp_id INT)
BEGIN
    SELECT name, salary FROM employee WHERE id = emp_id;
END //
DELIMITER ;
ログイン後にコピー

3. ストレージ関数を作成します

CREATE FUNCTION function_name([IN/OUT] parameter_name data_type) RETURNS data_type
BEGIN
    DECLARE variable_name data_type;
    SQL Statement;
    RETURN variable_name;
END;
ログイン後にコピー

すでに product## という名前の製品テーブルがあるとします。 #、今度は、製品番号に基づいて製品の単価をクエリできるストアド関数を作成する必要があります:

DELIMITER //
CREATE FUNCTION get_product_price_by_id(IN product_id INT) RETURNS DECIMAL(10,2)
BEGIN
    DECLARE price DECIMAL(10,2);
    SELECT unit_price INTO price FROM product WHERE id = product_id;
    RETURN price;
END //
DELIMITER ;
ログイン後にコピー

4. ストアド プロシージャとストアド関数の使用

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

  • CALL procedure_name([parameter_name]);
    ログイン後にコピー
  • ストアド関数の呼び出し:

  • SELECT function_name([parameter_name]);
    ログイン後にコピー

の使用上記で作成した get_employee_info_by_id ストアド プロシージャは次のように呼び出すことができます:

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

上記で作成した

get_product_price_by_id ストアド関数を使用すると、次のように呼び出すことができます:

SELECT get_product_price_by_id(1001);
ログイン後にコピー

以下は一般的なストアド プロシージャとストアド関数の例:

5. if ステートメントを使用したスト​​アド プロシージャ

employee という名前の従業員テーブルがすでにあるとします。従業員の名前と給与をクエリするストアド プロシージャを作成します。給与が 5000 より大きい場合は、結果に「高収入」というメモを追加します。

DELIMITER //
CREATE PROCEDURE get_employee_info_with_note()
BEGIN
    SELECT name, salary, IF(salary > 5000, '高收入', '') AS note FROM employee;
END //
DELIMITER ;
ログイン後にコピー

6. ループ ステートメントを含むストアド プロシージャ

product という名前の製品テーブルがすでにあると仮定し、製品を保存するストアド プロシージャを作成する必要があるとします。すべての単価に 1.1 を掛けます。

DELIMITER //
CREATE PROCEDURE update_all_product_price()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE pid INT;
    DECLARE price DECIMAL(10,2);
    DECLARE cur CURSOR FOR SELECT id, unit_price FROM product;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO pid, price;
        IF done THEN
            LEAVE read_loop;
        END IF;
        UPDATE product SET unit_price = price * 1.1 WHERE id = pid;
    END LOOP;
    CLOSE cur;
END //
DELIMITER ;
ログイン後にコピー

7. トランザクションを伴うストアド プロシージャ

order という名前の注文テーブルと order_item という注文詳細テーブルという名前の注文テーブルがすでにあると仮定します。次に、これら 2 つのテーブルにレコードを挿入するストアド プロシージャを作成する必要があります。

DELIMITER //
CREATE PROCEDURE insert_order(IN order_id INT, IN item_name VARCHAR(50), IN item_price DECIMAL(10,2), IN item_quantity INT)
BEGIN
    START TRANSACTION;
    INSERT INTO `order`(id) VALUES(order_id);
    SET @last_order_id = LAST_INSERT_ID();
    INSERT INTO order_item(order_id, item_name, item_price, item_quantity) VALUES(@last_order_id, item_name, item_price, item_quantity);
    COMMIT;
END //
DELIMITER ;
ログイン後にコピー

8. カーソルを使用したスト​​レージ関数

すでに

product という名前の製品テーブルがあり、次に製品テーブルにクエリを実行するストレージ関数を作成する必要があるとします。最大単価。

DELIMITER //
CREATE FUNCTION get_max_product_price() RETURNS DECIMAL(10,2)
BEGIN
    DECLARE max_price DECIMAL(10,2);
    DECLARE cur CURSOR FOR SELECT unit_price FROM product;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET max_price = 0;
    OPEN cur;
    FETCH cur INTO max_price;
    read_loop: LOOP
        FETCH cur INTO max_price;
        IF max_price IS NULL THEN
            LEAVE read_loop;
        END IF;
        IF max_price > @max_price THEN 
            SET @max_price = max_price;
        END IF;
    END LOOP;
    CLOSE cur;
    RETURN max_price;
END //
DELIMITER ;
ログイン後にコピー
9. ストアド プロシージャとストアド ファンクションの利点

  • コードを再利用できるため、SQL ステートメントを繰り返し記述する必要がなくなります。

  • フロー制御ステートメントをストアド プロシージャやストアド関数で使用して、複雑なロジックを処理できます。

  • ストアド プロシージャやストアド関数を通じてデータベース操作をカプセル化し、効率とセキュリティを向上させることができます。

以上がMYSQL ストアド プロシージャとストアド関数の使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!