MySQLストアドプロシージャにおけるカーソル(DECLARE)の原理と使い方の詳細な説明

MySQLストアドプロシージャにおけるカーソル(DECLARE)の原理と使い方の詳細な説明

この記事では、例を使用して、MySQL ストアド プロシージャにおけるカーソル (DECLARE) の原理と使用法を説明します。ご参考までに、詳細は以下の通りです。

カーソルを使用すると、クエリによって返された行のセットを反復処理し、それに応じて各行を処理できるため、ストアド プロシージャで結果セットを処理するときにカーソルを使用できます。 MySQL カーソルには、読み取り専用、スクロール不可、センシティブの 3 つのモードがあります。見てみましょう:

  • 読み取り専用: 基になるテーブルのデータはカーソルを通じて更新できません。
  • スクロール不可: 行は、選択ステートメントによって決定された順序でのみ取得できます。逆の順序で行を取得することはできません。 さらに、結果セット内の行をスキップしたり、特定の行にジャンプしたりすることはできません。
  • センシティブ: カーソルには、センシティブ カーソルとインセンシティブ カーソルの 2 種類があります。センシティブ カーソルは実際のデータを指し、インセンシティブ カーソルはデータの一時コピーを使用します。センシティブ カーソルは、一時的なデータのコピーを必要としないため、インセンシティブ カーソルよりも高速に実行されます。ただし、他の接続のデータに変更を加えると、センシティブ カーソルによって使用されるデータに影響するため、センシティブ カーソルによって使用されるデータは更新しない方が安全です。 MySQL カーソルは敏感です。

MySQL カーソルは、ストアド プロシージャ、ストアド ファンクション、トリガーで使用できます。まず、DECLARE ステートメントを使用してカーソルを宣言する構文を見てみましょう。

DECLARE cursor_name CURSOR FOR SELECT_statement;

カーソルの宣言は変数の宣言の後で行う必要があることに注意してください。変数宣言の前にカーソルを宣言すると、mysql はエラーを発行します。また、カーソルは常に SELECT ステートメントに関連付けられている必要があります。これで完了です。OPEN ステートメントを使用してカーソルを開きましょう。 OPEN ステートメントはカーソルの結果セットを初期化するため、結果セットから行をフェッチする前に OPEN ステートメントを呼び出す必要があります。

OPEN カーソル名;

次に、FETCH ステートメントを使用して、カーソルが指している次の行を取得し、カーソルを結果セット内の次の行に移動します。

FETCH cursor_name INTO 変数リスト;

その後、利用可能な行レコードがあるかどうかを確認し、それを取得できます。最後に、CLOSE ステートメントを呼び出してカーソルを非アクティブ化し、それに関連付けられたメモリを解放することを忘れないでください。

カーソル名を閉じます。

カーソルが使用されなくなったら閉じる必要があることを知っておく必要があります。 mysql カーソルを使用する場合は、カーソルが行を見つけられない場合を処理するために NOT FOUND ハンドラーも宣言する必要があります。 FETCH ステートメントが呼び出されるたびに、カーソルは結果セット内の次の行を読み取ろうとします。 カーソルが結果セットの末尾に到達すると、データを取得できなくなり、条件が生成されます。この状況を処理するには、NOT FOUND ハンドラを使用します。その文法構造を見てみましょう。

NOT FOUND SET finished = 1 の継続ハンドラーを宣言します。

finished は、カーソルが結果セットの末尾に到達したことを示す変数です。ハンドラー宣言は、ストアド プロシージャ内の変数およびカーソル宣言の後に配置する必要があることに注意してください。 MySQL カーソルの動作原理図を見てみましょう。

次に、従業員テーブル内のすべての従業員の電子メール アドレスのリストを取得するためのストアド プロシージャを開発します。まず、いくつかの変数、従業員の電子メールをループするためのカーソル、および NOT FOUND ハンドラーを宣言します。

終了した INTEGER DEFAULT 0 を宣言します。
電子メールvarchar(255)をDEFAULT ""として宣言します。
-- 従業員の電子メールのカーソルを宣言する
email_cursor CURSOR FORを宣言する
 従業員からのメールを選択します。
-- NOT FOUND ハンドラを宣言する
継続ハンドラを宣言する
NOT FOUNDの場合、finished = 1を設定します。
次に、OPEN ステートメントを使用して email_cursor を開きます。
email_cursor を開きます。

次に、電子メールのリストを反復処理し、区切り文字 (;) を使用して各電子メールを連結します。

get_email: ループ
 email_cursor を v_email にフェッチします。
 v_finished = 1の場合
 get_email を残します。
 終了の場合;
 --メールリストを作成
 SET email_list = CONCAT(v_email,";",email_list);
ループ終了 get_email;

その後、ループ内で v_finished 変数を使用して、リスト内にメールがあるかどうかを確認し、ループを終了します。完了したら、CLOSE ステートメントを使用してカーソルを閉じます。

email_cursor を閉じます。

build_email_list ストアド プロシージャのすべてのコードを見てみましょう。

区切り文字 $$
CREATE PROCEDURE build_email_list (INOUT email_list varchar(4000))
始める
 v_finished INTEGER DEFAULT 0 を宣言します。
    v_email varchar(100) DEFAULT "" を宣言します。
 -- 従業員の電子メールのカーソルを宣言する
 email_cursorカーソルを宣言する
 従業員からのメールを選択します。
 -- NOT FOUND ハンドラを宣言する
 継続ハンドラを宣言する
    見つからない場合は、v_finished = 1 に設定します。
 email_cursor を開きます。
 get_email: ループ
 email_cursor を v_email にフェッチします。
 v_finished = 1の場合
 get_email を残します。
 終了の場合;
 --メールリストを作成
 SET email_list = CONCAT(v_email,";",email_list);
 ループ終了 get_email;
 email_cursor を閉じます。
終わり$$
区切り文字 ;

次のスクリプトを使用して、build_email_list ストアド プロシージャをテストしてみましょう。

@email_list を設定します。
build_email_list(@email_list); を呼び出します。
@email_list を選択します。

結果については、詳しくは述べません。

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL ストアド プロシージャ スキル」、「MySQL 共通関数の概要」、「MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、および「MySQL データベース ロック関連スキルの概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL ストアド プロシージャ カーソル ループの使用の概要
  • MySQL ストアド プロシージャでカーソル ループを終了して継続する例
  • カーソルを使用したMySQLストアドプロシージャネストループのサンプルコード
  • MySQL ストアド プロシージャでカーソルを使用する例
  • MySQL 動的カーソル学習 (MySQL ストアド プロシージャ カーソル)
  • MySQL ストアド プロシージャ、カーソル、トランザクションの例の詳細な説明
  • Mysql ストアド プロシージャでカーソルを使用する例
  • カーソル ループを使用して、MySQL ストアド プロシージャで一時テーブルを読み取る
  • MySql ストアド プロシージャとカーソルの使用例

<<:  カスタムスクロールバー効果を実現するJavaScript

>>:  Centos7.X Linux システムに tomcat8 をインストールするためのグラフィック チュートリアル

推薦する

HTML+CSS マージテーブル境界線サンプルコード

table タグと td タグに境界線を追加すると、デフォルトでは次のように二重境界線が使用されます...

HTMLポップアップ透明レイヤーインスタンスのサイズを設定でき、比例することができます

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

ホームページのデザインはウェブデザイナーのレベルを最もよく反映する

私がこれまで携わってきた多くのプロジェクトでは、基本的に避けられない悪循環がありました。それは、ホー...

js に基づいて大きなファイルのアップロードとブレークポイントの再開を管理する方法

目次序文フロントエンド構造バックエンド構造(ノード+エクスプレス) FormDataに基づくファイル...

ElementUI の el-dropdown に複数のパラメータを実装する方法

最近、業務上のボタンの増加により、ページレイアウトにボタンが多すぎて、ページが美しくなく、ユーザーエ...

URL を入力すると、バックグラウンドでは具体的に何が起こるのでしょうか?

ソフトウェア開発者は、ネットワーク アプリケーションがどのように動作するかを階層的に完全に理解してい...

VUEは登録とログインの効果を実現します

この記事の例では、登録とログインの効果を実現するためのVUEの具体的なコードを紹介します。具体的な内...

LeetCode の SQL 実装 (181. 従業員は管理職よりも収入が高い)

[LeetCode] 181.従業員の収入が管理職よりも多い従業員テーブルには、マネージャーを含む...

マインスイーパゲームを実装するための jQuery プラグイン (2)

この記事では、jQueryプラグインを使用してマインスイーパゲームを実装する2番目の記事を参考までに...

VMware vSAN 入門概要

1. 背景1. vSphere の共有ストレージの背景を簡単に紹介するvSphere の重要な機能は...

MySQL のロックの仕組みと使用法の分析

この記事では、例を使用して MySQL のロック メカニズムと使用方法を説明します。ご参考までに、詳...

CSS を使用して物流の進行状況のスタイルを実装するためのサンプルコード

効果: CSS スタイル: <スタイル タイプ="text/css">...

Kubernetes の応用分野の概要

Kubernetes は、アプリケーションの移植性とハイブリッド クラウド/マルチクラウドの展開をサ...

Docker で MySQL マスター スレーブ レプリケーションを実装するためのサンプル コード

目次1. 概要1. 原則2. 実装3. スレーブインスタンスを作成する4. マスタースレーブ構成要約...

nginx をプロキシ キャッシュとして使用する方法

キャッシュを使用する目的は、バックエンドの負荷を軽減し、Web サイトの同時実行性を向上させることで...