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はファイルのアップロードとダウンロード機能を実装します

推薦する

js 配列から重複を削除する 11 の方法

実際の業務や面接では、「配列の重複排除」の問題によく遭遇します。以下は、js を使用して実装された配...

TypeScript インターフェース定義ケースチュートリアル

インターフェースの役割:インターフェース (英語: interface) の機能は、簡単に言えば、コ...

JQueryはアニメーション効果の非表示と表示を実装します

この記事では、アニメーション効果の非表示と表示を実現するためのJQueryの具体的なコードを参考まで...

vue構成ファイルはルーティングとメニューインスタンスコードを自動的に生成します

目次前面に書かれたルータ.jsonルート生成メニュー生成効果要約する前面に書かれたルートを繰り返し記...

CSS 向け SASS スタイル プログラミング ガイド

SASS を使用する開発者が増えるにつれて、SASS コードの数に注意する必要があります。 SASS...

Nginx でアクセス頻度、ダウンロード速度、同時接続数を制限する方法

1. アクセス頻度、同時接続、ダウンロード速度を制限するために使用されるモジュールと命令の概要ngx...

JS 非同期スタック トレース: await が Promise よりも優れている理由

概要async/await と Promise の基本的な違いは、await fn() は現在の関数...

Vue.js スタイルレイアウト Flutter ビジネス開発共通スキル

シャドウスタイルにおけるフラッターとCSSの対応UIによって指定されたCSSスタイル 幅: 75px...

Linux でテキストを表示するためのヒント (非常に実用的!)

序文日常の開発では、サーバー上でさまざまなテキストやログの表示操作を実行する必要があることがよくあり...

MySQL 8.0 の新機能の落とし穴と解決策についての簡単な説明 (要約)

1. ユーザーを作成して承認するMySQL 8.0 では、ユーザーの作成と認証が以前とは異なります...

Win7x64でのMySQL 5.7.18解凍版のインストール方法

関連記事: Win7 x64 に解凍版の mysql 5.7.18 winx64 をインストールする...

ネイティブ js を使用してライブ バレット スクリーンのスクロール効果をシミュレートします。

目次1. 基本原則2. 特定のコード要約する1. 基本原則まず、生放送エリアを10の部分に分割し(個...

ウェブデザインに必須のツール: Firefox Web Developer プラグイン CSS ツールセットのチュートリアル

プラグインは Firefox ブラウザにインストールされます。 Web Developer プラグイ...

VMware 仮想マシンの NAT モードを構成する方法

この記事では、VMware仮想マシンのNAT構成プロセスを詳しく説明します。具体的な内容は次のとおり...

CSS で放射状グラデーションを使用してカード効果を実現する

数日前、同僚がポイントモールプロジェクトを受け取りました。このプロジェクトには、カードやクーポンをギ...