この記事では、例を使用して、MySQL ストアド プロシージャにおけるカーソル (DECLARE) の原理と使用法を説明します。ご参考までに、詳細は以下の通りです。 カーソルを使用すると、クエリによって返された行のセットを反復処理し、それに応じて各行を処理できるため、ストアド プロシージャで結果セットを処理するときにカーソルを使用できます。 MySQL カーソルには、読み取り専用、スクロール不可、センシティブの 3 つのモードがあります。見てみましょう:
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データベース設計に役立つことを願っています。 以下もご興味があるかもしれません:
|
<<: カスタムスクロールバー効果を実現するJavaScript
>>: Centos7.X Linux システムに tomcat8 をインストールするためのグラフィック チュートリアル
目次ヘッドレスブラウザとは何ですか?なぜ「ヘッドレス」ブラウザと呼ばれるのでしょうか?ヘッドレスブラ...
Nginx は、わずか数年で Web サーバー市場の大部分を占めるようになりました。周知のとおり、N...
この記事では、二次リンク効果を実現するためのReactの具体的なコードを参考までに共有します。具体的...
MySQL でデータを削除するには 2 つの方法があります。切り詰めは大まかな伐採の一種である削除は...
1. Apache 静的リソースのクロスドメイン アクセスApache設定ファイルhttpd.con...
Python は MySQL に接続してデータベース テーブルを変更およびクエリします。 pytho...
私は熟練した DBA になるつもりはありませんが、MySQL を最適化するときは、いくつかの構成を調...
目次起源現状リクエストをキャンセル cancelTokenリクエスト方法の変更重複したリクエストを避...
目次JVM クラスローダーTomcat クラスローダークラスを検索ロードクラスクラスをロードしようと...
この記事では、ネイティブ JS で実装された特殊効果メッセージ ボックスを紹介します。効果は次のとお...
これら 2 つの属性はよく使用されますが、その違いはまとめられていません。それでは、その使い方をまと...
この記事では、携帯電話のプルダウンリフレッシュを模倣したjsの具体的なコードを参考までに共有します。...
1. ダウンロードしたMySQLの圧縮パッケージをインストールディレクトリに解凍します。 2. 新し...
01. コマンドの概要Linux には充実したヘルプ マニュアルが用意されています。コマンドのパラメ...
今日、新しい技を学びました。あまりやったことがなかったので、今まで知りませんでした...目的: リン...