mysqlはストアドプロシージャを使用します

王林
リリース: 2023-05-20 10:25:37
オリジナル
1524 人が閲覧しました

MySQL は現在最も人気のあるリレーショナル データベース管理システムであり、ストアド プロシージャを使用して SQL ステートメントとプログラムの実行をより適切に維持および管理します。ストアド プロシージャは、よく使用される SQL ステートメントをカプセル化して複数の実行時の効率を向上させ、ランタイム リソースの使用量を削減できる、プリコンパイルされた SQL コード ブロックです。

MySQL でのストアド プロシージャの使用

1. ストアド プロシージャの作成

基本的に言えば、ストアド プロシージャの作成とは、SQL ステートメント ブロックを記述してシステム データベースに作成することです。このコード ブロックを保存します。具体的な例を次に示します。

CREATE PROCEDURE `procedure_name` (`parameter_list`)
BEGIN
    -- SQL 语句块
END
ログイン後にコピー

このうち、 procedure_name はストアド プロシージャの名前、 paramter_list はストアド プロシージャのパラメータ リストです。入力パラメータと出力パラメータを含めることも、パラメータを含めないこともできます。

たとえば、ユーザー情報を取得するストアド プロシージャを作成します。

CREATE PROCEDURE `get_user_info`(user_id INT)
BEGIN
    SELECT * FROM `user` WHERE `user_id` = user_id;
END
ログイン後にコピー

ストアド プロシージャの SQL ステートメント ブロックでは、MySQL でサポートされるすべての SQL ステートメント (SELECT、 INSERT、UPDATE、DELETE など。IF、WHILE、LOOP などの制御フロー ステートメントを使用して、より複雑なデータ ロジック処理を実現することもできます。

2. ストアド プロシージャを呼び出す

ストアド プロシージャを作成した後、CALL ステートメントを通じてストアド プロシージャを呼び出し、それにパラメータを渡すことができます。次の方法で上記で定義した

get_user_info

ストアド プロシージャを呼び出します: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:sql;toolbar:false;'>CALL procedure_name(param1, param2, ...)</pre><div class="contentsignin">ログイン後にコピー</div></div>3. ストアド プロシージャを削除します

時間が経つと、ストアド プロシージャが削除されます。必要に応じて、DROP PROCEDURE ステートメントを使用して削除できます:

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

例:

DROP PROCEDURE `procedure_name`;
ログイン後にコピー

4. ストアド プロシージャ インスタンス

完全なストアド プロシージャ インスタンスを見てみましょう。学生のテストのスコアを保存する

score

テーブルがあり、各学生の合計スコアと平均スコアを計算し、合計スコアに従って高い順に並べる必要があるとします。現時点では、ストアド プロシージャを使用して次のことを実現できます。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:sql;toolbar:false;'>DROP PROCEDURE `get_user_info`;</pre><div class="contentsignin">ログイン後にコピー</div></div>このストアド プロシージャでは、最初に、使用する必要があるいくつかの変数を定義します。

total_score

は、スコアの合計を表します。 Student、avg_score は特定の生徒の平均点を表し、stu_id は特定の生徒の番号を表し、stu_name は特定の生徒の名前を表します。は一時テーブル tmp_score です。 次に、

DECLARE CURSOR

ステートメントを使用して、学生テーブル内の学生番号をクエリするために使用されるカーソル変数 cursor_stu_id を宣言しました。このループでは、生徒番号に基づいてスコア テーブルをクエリし、生徒の合計スコアと平均スコアを計算し、それらを一時テーブルに保存します。最後に、SELECT ステートメントを使用して一時テーブルをクエリし、合計スコアを高いものから低いものに並べ替え、最後に DROP TABLE ステートメントを使用して一時テーブルを削除します。 最後に、

CALL

ステートメントを使用して、このストアド プロシージャを呼び出すことができます。

CREATE PROCEDURE `calc_stu_score`()
BEGIN
     DECLARE `total_score` INT;
     DECLARE `avg_score` FLOAT;
     DECLARE `stu_id` INT DEFAULT 0;
     DECLARE `stu_name` VARCHAR(255);
     DECLARE `total` INT DEFAULT 0;
    DECLARE `cursor_stu_id` CURSOR FOR SELECT `stu_id` FROM `score` GROUP BY `stu_id`;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = TRUE;

    DROP TEMPORARY TABLE IF EXISTS `tmp_score`;
    CREATE TEMPORARY TABLE `tmp_score` (
        `stu_id` INT NOT NULL,
        `stu_name` VARCHAR(255) NOT NULL,
        `total_score` INT NOT NULL,
        `avg_score` FLOAT NOT NULL,
        PRIMARY KEY (`stu_id`)
    );

    OPEN cursor_stu_id;

    stu_loop: LOOP
        FETCH cursor_stu_id INTO stu_id;
        IF finished = TRUE THEN 
            LEAVE stu_loop;
        END IF;

        SELECT `name` INTO stu_name FROM `student` WHERE `stu_id` = stu_id;

        SELECT SUM(`sorce`), COUNT(*) INTO total_score, total FROM `score` WHERE `stu_id` = stu_id;

        SET avg_score = total_score / NULLIF(total, 0);

        INSERT INTO `tmp_score` (`stu_id`, `stu_name`, `total_score`, `avg_score`) VALUES (stu_id, stu_name, total_score, avg_score);

    END LOOP;

    CLOSE cursor_stu_id;

    SELECT * FROM `tmp_score` ORDER BY `total_score` DESC;

    DROP TEMPORARY TABLE `tmp_score`;

END
ログイン後にコピー
summary

ストアド プロシージャは、MySQL の非常に強力なツールです。これにより、データベースの運用プロセスが大幅に簡素化され、データベースのパフォーマンスとセキュリティが向上します。実際のアプリケーションでは、ストアド プロシージャを使用して多くの複雑なデータ処理操作を完了し、ビジネス ニーズをより適切に満たし、効率を向上させ、コストを削減できます。

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

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