MySQL カーソルの定義と使用法

MySQL カーソルの定義と使用法

カーソルの作成

まず、MySql でデータ テーブルを作成します。

存在しない場合はテーブルを作成 `store` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(20) NOT NULL,
 `count` int(11) NOT NULL デフォルト '1',
 主キー (`id`)
) ENGINE=InnoDB デフォルト CHARSET=latin1 AUTO_INCREMENT=7;
 
`store` (`id`, `name`, `count`) 値に INSERT します
(1、「アンドロイド」、15)、
(2、「iPhone」、14)、
(3、「iPhone」、20)、
(4、「アンドロイド」、5)、
(5、「アンドロイド」、13)、
(6、「iPhone」、13);

ここで、ストアド プロシージャを使用して、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カーソルの詳細な紹介

<<:  マークアップ言語 - リスト

>>:  ラジオボタンとチェックボックス効果の純粋な CSS 実装例

推薦する

yum から docker インストール パッケージをダウンロードし、オフライン マシンにインストールする例の詳細なコード

1. ネットワークマシンでは、デフォルトのcentosyumソースを使用します [root@kole...

MySQL の自動増分 ID に関するいくつかの小さな問題の要約

以下の質問はすべて InnoDB ストレージ エンジンに基づいています。 1. 最も大きな ID を...

MySQL の乗算と除算の精度の不一致の問題 (除算後の小数点以下 4 桁)

質問今日、プロジェクト関数を書いていたとき、金額の統計計算を行い、単位を変換する必要がありました。そ...

Vueはプライベートフィルターと基本的な使用法を定義します

プライベート フィルターとグローバル フィルターのメソッドと概念は同じですが、プライベート フィルタ...

VirtualBox での CentOS 8.1 仮想マシンのインストールを最小限に抑える詳細なチュートリアル

1. 関連ツールと画像をダウンロードするダウンロードリンクバーチャルボックス: https://do...

Centos7.4 サーバーへの Apache のインストールとインストール プロセス中に発生した問題の解決策

この記事では、CentOS 7.4 サーバーに Apache をインストールする方法と、インストール...

mini-vueレンダリングのシンプルな実装

目次序文ターゲット最初のステップ:ステップ2:ステップ3:ステップ4:要約する序文現在主流のフレーム...

検索データ表示を実装するJavaScript

この記事ではJavaScript検索のデータ表示コードを参考までに共有します。具体的な内容は以下のと...

Vue2.0/3.0双方向データバインディングの実装原理の詳細説明

Vue2.0/3.0双方向データバインディングの実装原理双方向データバインディングとは、データの変更...

Vue で rem 適応を使用する方法

1. 開発環境vue 2. コンピュータシステム Windows 10 Professional E...

Linux ソースコードからのソケット (TCP) クライアント側での接続の例の詳細な説明

序文著者は、アプリケーションからフレームワーク、オペレーティング システムに至るまで、あらゆるコード...

nginx を使用してカナリアリリースをシミュレートする方法

この記事では、ブルーグリーン デプロイメントと、nginx を使用してカナリア リリースを最も簡単な...

JavaScript でサウンド効果付きの花火効果を実装する

コードを書くのに 30 分かかりましたが、この HTML5 Canvas New Year Fire...

Zabbix で Windows のパフォーマンスを監視する方法

背景情報最近、Windows パフォーマンスに関する本を読み直しています。以前は SCOM 監視を使...

MySQL の問題を解決する: MSVCR120.dll が見つからないため、コードの実行を続行できません

1. 問題MySQL の初期化時に発生する問題は、次のとおりです。 1. 「MSVCR120.dll...