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 実装例

推薦する

ウェブフロントエンドウェブ開発の一般的なプロセスの簡単な紹介

フロントエンド開発を行っている初心者の学生を多く見かけますが、彼らの効率は比較的遅いです。常にコード...

HTML におけるスクリプトの配置に関する簡単な説明

以前は、スクリプトは HTML 内のどこにでも配置できると思っていましたが、今日、要件に取り組んでい...

MySQL ステートメントを使用して、さまざまな整数が占めるバイト数とその最大値と最小値を調べる例

直接コード: タイプとして「bigint unsigned」、バイトとして「8」、max_numとし...

Webフロントエンド開発コース Webフロントエンド開発ツールとは

インターネット技術の発展に伴い、ユーザーはますます Web ページに依存するようになり、Web フロ...

MySQL で複数のフィールドを連結する詳細な例

MySQL クエリ結果の行フィールドの結合は、次の 2 つの関数を使用して実装できます。 1. co...

JavaScript を学ぶときに知っておくべき 3 つのヒント

目次1. 魔法の拡張演算子1. 配列をコピーする2. 配列を結合する3. オブジェクトを展開する2....

Tomcat9 Windows サービスのインストールに関する詳細なチュートリアル

1. 準備1.1 service.bat を含む tomcat 圧縮パッケージをダウンロードします。...

vueはEle.me UIを使用してteambitionのフィルタリング機能を模倣します

目次問題の説明一般的な機能効果は次のとおりです。思考分析完全なコード要約する問題の説明Teambit...

同じレベルの要素で Position:fixed と margin-top を一緒に使用する場合の CSS の問題

問題の説明CSS を使用して上部の固定効果を実現したいと思います。 margin-top と pos...

MySQL の if 関数の正しい使い方の詳細な説明

今日私が書こうとしている内容では、プログラムは 7 時間近く実行され、データベースに 1,000 万...

Manjaro インストール CUDA 実装チュートリアル分析

昨年末、Thinkpad T450 のデュアルシステムの opensuse を Manjaro に置...

MySQL で 2 つのテーブルをクエリする場合の from と join の違いの概要

序文MySQL では、複数テーブル結合クエリは非常に一般的な要件です。複数テーブルクエリを使用する場...

MySQL をデプロイするときに発生する「テーブル mysql.plugin が存在しません」という問題の解決方法

今日、MySQL の無料インストール版をデプロイしたところ、テーブル 'mysql.plug...

Linux で実行中のすべてのプロセスを表示する方法

ps コマンドを使用できます。プロセスの PID など、現在実行中のプロセスに関する関連情報を表示で...

将来最も成功する企業はテクノロジー企業でしょうか、それともデザイン企業でしょうか?

ムーアの法則はもはや適用されない2004年にフレックストロニクスがフロッグデザインを買収したのを皮切...