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 をインストールするためのグラフィック チュートリアル

推薦する

JavaScript es6 の新しい配列メソッドの詳細な説明

目次1. 各() 2. arr.filter() 3. arr.every() 4. arr.map...

HttpとHttpsの両方をサポートするNginxの詳細な設定

最近の Web サイトでは Https をサポートすることがほぼ標準機能となっており、Nginx は...

MySql クライアントが数秒で終了する問題を解決する (my.ini が見つからない)

問題の説明 (環境: windows7、MySql8.0)今日、MySql をインストールした後、M...

Baidu 入力メソッドが API を公開、自由に移植して使用できると主張

百度入力方式の担当者は、百度入力方式のオープンAPIの最大の利点は操作が便利であることであり、プラッ...

MySQLの指定順序ソートクエリについての簡単な説明

最近、空港や駅でフライト情報を表示するものと似た大型スクリーンディスプレイのプロジェクトに取り組んで...

MySQL 5.7 の sql_mode のデフォルト値によって生じる落とし穴と解決策

通常のプロジェクト開発中に、MySQL バージョンが 5.6 から 5.7 にアップグレードされた場...

nginxでgzip圧縮を有効にする手順を完了する

目次序文1. gzip圧縮を設定する2. 詳細設定3. nginxサービスを再起動する要約する序文ウ...

js のマクロタスクとマイクロタスクについての簡単な説明

目次1. JavaScriptについて2. JavaScript イベントループ3. マクロタスクと...

SpringBoot アプリケーションの Docker デプロイメントの実装手順

目次序文DockerファイルDockerfile とは何ですか? Dockerfile 構文Spri...

CentOS7にPHP7 Redis拡張機能をインストールする方法

導入前回の記事では、Redis をインストールして設定しましたが、まだ終わりではありません。PHP ...

Nginx ベースの HTTPS ウェブサイトを設定する手順

目次序文:暗号化アルゴリズム: 1. HTTPS の概要2. NginxはHTTPSウェブサイト設定...

MySQLオンラインデータベースのデータをクリーンアップする方法

目次01 シナリオ分析02 操作方法03 結果分析01 シナリオ分析今日の午後、開発仲間がオンライン...

ウィンドウ内のさまざまな距離/スクロール距離の正確な計算の概要

通常、プロジェクト開発では、マージン、位置、座標などを扱う必要があります。悲劇なのは、これらの概念が...

VMware 15.5 に CentOS7 をインストールするためのグラフィック チュートリアル

1. VMware 15.5で新しい仮想マシンを作成する1. VMware を開き、ホームページで「...

Docker で MySQL をデプロイする詳細なプロセス (Docker でデプロイされる一般的なアプリケーション)

以前にも紹介しました: docker (一般的なアプリケーションのデプロイ): docker dep...