MySQLカーソルの使い方と機能の詳細な説明

MySQLカーソルの使い方と機能の詳細な説明

[mysqlカーソルの使い方と機能]

例:

現在、テーブル A、B、C の 3 つのテーブルがあります。A と B は 1 対多の関係にあり、B と C は 1 対多の関係にあります。ここで、テーブル B のテーブル A の主キーをテーブル C に格納する必要があります。
従来の考え方では、テーブル B をクエリし、次に更新ステートメントを使用してテーブル C を更新しますが、テーブル B には 2,000 件を超えるレコードが存在します。
2,000 回以上実行する必要がありますか?これは明らかに非現実的です。最終的に、ストアド プロシージャを記述し、ループを通じて C テーブルを更新する方法を見つけました。
ただし、ストアド プロシージャはカーソルの形式で記述されます。

【導入】

カーソルは、実際には、複数のデータ レコードを含む結果セットから一度に 1 つのレコードを抽出できるメカニズムです。

カーソルはポインターとして機能します。

カーソルは結果セット内のすべての行を走査できますが、一度にポイントできるのは 1 行だけです。

カーソルの機能は、クエリ データベースによって返されたレコードを走査して、対応する操作を実行することです。

【使用法】

1. カーソルを宣言します: カーソル名 CURSOR for table; を宣言します (ここでのテーブルは、クエリする任意のコレクションにすることができます)
2. 定義されたカーソルを開きます: open cursor name;
3. 次のデータ行を取得します: FETCH cursor name into testrangeid, versionid;
4. 実行するステートメント(追加、削除、変更、チェック):これは具体的な状況によって異なります。
5. カーソルを解放します: CLOSE カーソル名;

注意: MySQL ストアド プロシージャ内の各ステートメントは ; で終わる必要があり、使用される一時フィールドはカーソルを定義する前に宣言する必要があります。

【例】

- 
始める 
 
--変数を定義します。declare testrangeid BIGINT; 
versionid を BIGINT として宣言します。 
完了した int を宣言します。 
--カーソルを作成し、データを保存します。cur_test CURSORを宣言します。 
 tp_testrange から id を testrangeid として、version_id を versionid として選択します。 
--カーソル内のコンテンツが実行された後、doneを1に設定します 
 NOT FOUND SET done=1 の継続ハンドラーを宣言します。 
--カーソルを開きます。open cur_test; 
--ループを実行 posLoop:LOOP 
--ループを終了するかどうかを判断します IF done=1 THEN 
  POSループを終了します。 
 終了の場合; 
--カーソル内の値を取得します FETCH cur_test into testrangeid,versionid; 
--更新操作を実行します。update tp_data_execute set version_id=versionid where testrange_id = testrangeid; 
 ループ終了 posLoop; 
--カーソルを解放します CLOSE cur_test; 
 
終わり 
-

例2:

ここで、ストアド プロシージャを使用して、iPhone の総在庫数をカウントし、その合計数をコンソールに出力する関数を作成します。

--Windows システムでストアド プロシージャを作成するときに、変数を宣言するために declaration を使用する必要がある場合は、このキーワードを追加する必要があります。そうしないと、エラーが報告されます。 
区切り文字 // 
StatisticStore が存在する場合は手順を削除します。 
CREATE PROCEDURE StatisticStore() 
始める 
 --カーソル データを受け取る変数を作成します。declare c int; 
 n varchar(20)を宣言します。 
 --total 変数を作成します。declare total int default 0; 
 --終了フラグ変数を作成します。declare done int default false; 
 --カーソルを作成します。declare cur cursor for select name,count from store where name = 'iphone'; 
 --カーソル ループの終了時の戻り値を指定します。declare continue HANDLER for not found set done = true; 
 --初期値を設定します。set total = 0; 
 --カーソルを開きます open cur; 
 --カーソル内のデータのループを開始します read_loop:loop 
 --カーソルが現在指しているデータに従って、cur を n,c にフェッチします。 
 --カーソルループが終了したかどうかを判断します。終了した場合は 
  leave read_loop; --カーソルループから抜け出す end if; 
 --データを取得するときに、カウント値を追加します。ここでは何でも好きなようにできます。 
 合計を合計 + c に設定します。 
 --カーソル ループを終了します。end loop; 
 --カーソルを閉じます close cur; 
 
 --出力結果 select total; 
終わり; 
-- ストアド プロシージャ call StatisticStore() を呼び出します。

フェッチは、カーソルが現在指しているデータ行を取得し、ポインタを次の行に向けることです。カーソルがすでに最後の行を指している状態で実行を続けると、カーソルがオーバーフローします。
ループ カーソルを使用する場合、最後のデータに到達したかどうかは監視されません。次のコードは無限ループを引き起こします。

read_loop:ループ 
cur を n,c にフェッチします。 
合計を total+c に設定します。 
ループを終了します。

MySql では、カーソル オーバーフローが発生すると、MySQL の定義済み NOT FOUND エラーがトリガーされます。したがって、上記の次のコードは、not found エラーがトリガーされたときに continue イベントを定義し、このイベントが発生したときに done 変数の値が変更されることを指定するために使用されます。

見つからない場合の続行ハンドラーを宣言し、done = true を設定します。

そこで、ループに次のコードを追加しました。

--カーソルループが終了したかどうかを判断します。終了した場合は 
 leave read_loop; --カーソルループから抜け出す end if;

done の値が true の場合、ループは終了します。次のコードを実行し続けます

使い方

カーソルを使用する方法は 3 つあります。
最初のものは、ループを使用した上記の実装です。
2 番目の方法は、while ループを使用する方法です。

StatisticStore1 が存在する場合はプロシージャを削除します。 
プロシージャ StatisticStore1() を作成します。 
始める 
 c int を宣言します。 
 n varchar(20)を宣言します。 
 合計 int のデフォルトを 0 と宣言します。 
 宣言完了 int デフォルト false; 
 name = 'iphone' の store から name,count を選択するための cur カーソルを宣言します。 
 見つからない場合の続行ハンドラーを宣言し、done = true を設定します。 
 合計を 0 に設定します。 
 オープンカー; 
 cur を n,c にフェッチします。 
 (行われていない)しながら行う 
  合計を合計 + c に設定します。 
  cur を n,c にフェッチします。 
 終了しながら; 
  
 クローズカー; 
 合計を選択; 
終わり; 
 
StatisticStore1() を呼び出します。

3 番目の方法は、繰り返し実行を使用することです。

StatisticStore2 が存在する場合は手順を削除します。 
プロシージャ StatisticStore2() を作成します。 
始める 
 c int を宣言します。 
 n varchar(20)を宣言します。 
 合計 int のデフォルトを 0 と宣言します。 
 宣言完了 int デフォルト false; 
 name = 'iphone' の store から name,count を選択するための cur カーソルを宣言します。 
 見つからない場合の続行ハンドラーを宣言し、done = true を設定します。 
 合計を 0 に設定します。 
 オープンカー; 
 繰り返す 
 cur を n,c にフェッチします。 
 完了しない場合は 
  合計を合計 + c に設定します。 
 終了の場合; 
 完了するまで繰り返します。 
 クローズカー; 
 合計を選択; 
終わり; 
 
StatisticStore2() を呼び出します。

ネストされたカーソル

MySQL では、各 begin end ブロックは独立したスコープ領域です。MySQL では同じエラー イベントを 1 回しか定義できないため、複数回定義すると、コンパイル時に同じブロックで宣言された重複ハンドラーが表示されます。

StatisticStore3 が存在する場合は手順を削除します。 
プロシージャ StatisticStore3() を作成します。 
始める 
 _n varchar(20)を宣言します。 
 宣言完了 int デフォルト false; 
 名前でストアグループから名前を選択するための cur カーソルを宣言します。 
 見つからない場合の続行ハンドラーを宣言し、done = true を設定します。 
 オープンカー; 
 read_loop:ループ 
 cur を _n にフェッチします。 
 完了したら 
  read_loop を終了します。 
 終了の場合; 
 始める 
  c int を宣言します。 
  n varchar(20)を宣言します。 
  合計 int のデフォルトを 0 と宣言します。 
  宣言完了 int デフォルト false; 
  name = 'iphone' の store から name,count を選択するための cur カーソルを宣言します。 
  見つからない場合の続行ハンドラーを宣言し、done = true を設定します。 
  合計を 0 に設定します。 
  オープンカー; 
  iphone_loop:ループ 
  cur を n,c にフェッチします。 
  完了したら 
   iphone_loop を終了します。 
  終了の場合; 
  合計を合計 + c に設定します。 
  ループを終了します。 
  クローズカー; 
  _n,n,合計を選択します。 
 終わり; 
 始める 
   c int を宣言します。 
   n varchar(20)を宣言します。 
   合計 int のデフォルトを 0 と宣言します。 
   宣言完了 int デフォルト false; 
   name = 'android' の store から name,count を選択するための cur カーソルを宣言します。 
   見つからない場合の続行ハンドラーを宣言し、done = true を設定します。 
   合計を 0 に設定します。 
   オープンカー; 
   android_loop:ループ 
   cur を n,c にフェッチします。 
   完了したら 
    android_loop を終了します。 
   終了の場合; 
   合計を合計 + c に設定します。 
   ループを終了します。 
   クローズカー; 
  _n,n,合計を選択します。 
 終わり; 
 始める 
  
 終わり; 
 ループを終了します。 
 クローズカー; 
終わり; 
 
StatisticStore3() を呼び出します。

上記はネストされたループを実装するためのものですが、もちろんこの例は無理があります。とりあえず見てみましょう。

動的SQL

MySQLは動的SQL関数をサポートしている

@sqlStr を 'select * from table where condition1 = ?' に設定します。 
@sqlStr 用に s1 を準備します。 
-- 複数のパラメータがある場合は、カンマで区切ります。@condition1 を使用して s1 を実行します。 
-- 手動で解放するか、接続が閉じられると、サーバーは自動的に deallocate prepare s1 をリサイクルします。

以上がMySQLカーソルの詳しい説明です。MySQLカーソルの詳細については、123WORDPRESS.COMの他の関連記事もご覧ください。

以下もご興味があるかもしれません:
  • MySQL カーソルの定義と使用法
  • カーソル ループを使用して、MySQL ストアド プロシージャで一時テーブルを読み取る
  • MySQLでカーソルを宣言する方法
  • MySQL カーソルの原理と使用例の分析
  • Pythonで徹底的にわかるMySQLデータベース操作(カーソル解説)
  • MySQLストアドプロシージャにおけるカーソル(DECLARE)の原理と使い方の詳細な説明
  • MySQL カーソルの概念と使用法の詳細な説明
  • MySQL ストアド プロシージャ、カーソル、トランザクションの例の詳細な説明
  • Mysql ストアド プロシージャでカーソルを使用する例
  • カーソルを使用したMySQLストアドプロシージャネストループのサンプルコード
  • MySQL ストアド プロシージャでカーソル ループを終了して継続する例
  • MySQL カーソル関数と使用法

<<:  Zabbixで指定時間内の変化値を設定する方法の詳細な説明

>>:  Vueはファイルのアップロードとダウンロード機能を実装します

推薦する

docker cp ファイルをコピーしてコンテナに入る

実行中のコンテナに入る # コンテナに入り、新しいターミナルを開きます# docker exec -...

MySQL 5.7.18 インストールチュートリアルと問題の概要

MySQL 5.7.18 のインストールと問題の概要。今日、新しい MySQL サーバーを導入しまし...

読み込み進捗バーのネイティブ JS 実装

この記事では、ネイティブ JS によって実装された動的読み込みプログレス バーの特殊効果を紹介します...

MySQL における in と exists の違いの詳細な説明

1. 事前に準備する便宜上、ここで 2 つのテーブルを作成し、そこにいくつかのデータを追加します。果...

Vue3はサイドナビゲーションテキストスケルトン効果コンポーネントをカプセル化します

Vue3プロジェクトのカプセル化サイドナビゲーションテキストスケルトン効果コンポーネント-グローバル...

ミニプログラムカスタムコンポーネントの非効率的なグローバルスタイルの解決策

目次長すぎて読めないコンポーネントスタイルの分離デモテスト優先度ページの分離構成参考文献ネイティブ ...

JSはじゃんけんゲームを実装します

この記事の例では、じゃんけんゲームを実装するためのJSの具体的なコードを参考までに共有しています。具...

CentOS 8.4 に Docker をインストールする詳細なチュートリアル

目次序文:システム要件:インストール環境:古いバージョンをアンインストールします: yum は具体的...

CentOS 7 で Docker のポート転送をファイアウォールと互換性のあるように設定する方法

CentOS 7 では、次のようなコマンドを使用してホスト ポートをコンテナー ポートにマッピングす...

MySQL 8.0.15 のインストールと設定のグラフィックチュートリアル

この記事ではMySQL 8.0.15のインストールと設定方法を参考までに記録します。具体的な内容は以...

WeChatアプレットを使用して天井効果を実現する方法の例

目次1. 実装2. 問題点3. より良い実装方法があるかどうか検討する要約する背景は日付のタイトルで...

MySQL 5.7.24 のインストールと設定方法のグラフィックチュートリアル

MySQL は最も人気のあるリレーショナル データベース管理システムです。WEB アプリケーションに...

js はマウスインとマウスアウトによるカード切り替えコンテンツを実装します

この記事では、マウスでカード内外のコンテンツを切り替えるためのjsの具体的なコードを紹介します。具体...

JS と Nodejs におけるイベント駆動型開発についての簡単な説明

目次イベント駆動型とパブリッシュ・サブスクライブ型ブラウザの JavaScript ではイベント駆動...

https ウェブサイトを展開し、Nginx でアドレス書き換えを構成するための詳細な手順

Nginx は、高性能な Web サイト サーバーおよびリバース プロキシ サーバーであり、IMAP...