MySQL カーソルの概念と使用法の詳細な説明

MySQL カーソルの概念と使用法の詳細な説明

この記事では、例を使用して MySQL カーソルの概念と使用方法を説明します。ご参考までに、詳細は以下の通りです。

1. カーソルの概念(カーソル)

1 つの SQL 文は N 個のリソースに対応します。リソースを取得するためのインターフェイスはカーソルです。カーソルに従って、一度に 1 行を取得できます。 Android を開発したことがあるなら、Cursor という API があることを知っているはずです。これは、これと多少似た SQLite データベースの読み取りにも使用されます。

2. カーソルを使用する手順

(1)声明

宣言を使用して宣言する

select_statement のカーソル名カーソルを宣言します

(2)カーソルを開く

開くにはopenを使用します

オープンカーソル名

(3)カーソルから値を取得する

フェッチを使用して値を取得する

カーソル名をvar1,var2[,...]にフェッチします -- フェッチした行を複数の変数に割り当てます

(4)カーソルを閉じる

カーソルを閉じるにはcloseを使用します

カーソル名を閉じる

3. シンプルなカーソルを作成する

要件: 製品テーブルから最初の行のデータを読み取る

商品テーブルデータ:

這里寫圖片描述

注: ここでは MySQL 終了識別子を $ に変更しました。 $ に設定する方法を知りたい場合は、前の記事「MySQL トリガー」を参照してください。

意味:

プロシージャ p12() を作成する
始める
  /*製品ID、製品名、製品在庫を格納するための3つの変数を定義します*/
  row_gid int を宣言します。 
  row_name varchar(20) を宣言します。
  row_num int を宣言します。
  getgoods カーソルを宣言します。 for select gid,name,num from goods; --カーソルを定義します。 open getgoods; --カーソルを開きます。 fetch getgoods into row_gid,row_name,row_num;--カーソルから値を取得します。 select row_name,row_num; --操作を表示します。 close getgoods; --カーソルを閉じます。 end$

出力:

這里寫圖片描述

4. 複数の値の操作

プロシージャ p13() を作成する
始める
  row_gid int を宣言します。
  row_name varchar(20) を宣言します。
  row_num int を宣言します。
  getgoods カーソルを宣言して、goods から gid、name、num を選択します。  
  getgoods を開きます。
  getgoods を row_gid、row_name、row_num にフェッチします。
  行名、行番号を選択します。
  getgoods を row_gid、row_name、row_num にフェッチします。
  行名、行番号を選択します。
  getgoods を row_gid、row_name、row_num にフェッチします。
  行名、行番号を選択します。
  getgoods を row_gid、row_name、row_num にフェッチします。
  行名、行番号を選択します。
  getgoodsを閉じる;
終了$

出力:

這里寫圖片描述

注意: カーソルが末尾に到達した場合、値の取得を続行するとエラーが発生します。

5. カーソルはテーブル内のすべてのデータをループします

(1)カウンターを使ってループする

プロシージャ p14() を作成する
始める 
  cnt int のデフォルトを 0 と宣言します。
  i int をデフォルトで 0 と宣言します。
  row_gid int を宣言します。
  row_name varchar(20) を宣言します。
  row_num int を宣言します。
  getgoods カーソルを宣言して、goods から gid、name、num を選択します。
  goods から count(*) を cnt に選択します。
  getgoods を開きます。
  繰り返す 
    getgoods を row_gid、row_name、row_num にフェッチします。
  行名、行番号を選択します。
  i:= i+1 と設定します。
  i >= cnt になるまで繰り返し終了;
  getgoodsを閉じる;
終了$

出力:

這里寫圖片描述

(2)アウトオブバウンズフラグを使ってループを制御する

mysqlカーソルでは、範囲外フラグを操作するためにdeclare continue handlerを宣言することができます。

文法:

NOT FOUND ステートメントの継続ハンドラを宣言します。

使用:

プロシージャ p15() を作成する
始める
  row_gid int を宣言します。
  row_name varchar(20) を宣言します。
  row_num int を宣言します。
  have int default 1 を宣言します。
  getgoods カーソルを宣言して、goods から gid、name、num を選択します。
  NOT FOUND の継続ハンドラを宣言し、have:= 0 を設定します。
  getgoods を開きます。
  繰り返す 
    getgoods を row_gid、row_name、row_num にフェッチします。
  行名、行番号を選択します。
  have = 0 になるまで繰り返し終了;
  getgoodsを閉じる;
終了$

出力:

這里寫圖片描述

注意:ここでエラーが発生しました。4行のデータが出力されましたが、テーブルには3行のデータしかありませんでした。また、警告が表示されました。この問題の解決方法については後ほど説明します。

プログラム実行ロジック:

ループカーソル -> 3 番目のデータを取得 -> 表示 -> 4 番目のデータを取得 -> データなし -> have=0 操作を設定 -> 続行ハンドラを実行 -> プログラムは終了せず、表示操作を実行 -> 3 番目のデータを表示

6. 続行と終了の違い

続行: データが返されない場合、プログラムは続行され、変数 IS_FOUND が 0 に設定されます。これは、select XX into XXX from tablename を実行するときに発生します。
exit: データが返されない場合は、プログラムを終了し、変数 IS_FOUND を 0 に設定します。これは、select XX into XXX from tablename を実行すると発生します。

exit を使用して continue を置き換えます。
exit を使用すると、上記のような状況は発生しません。プログラムの実行ロジックは次のとおりです。

ループカーソル -> 3番目のデータを取得 -> 表示 -> 4番目のデータを取得 -> データなし -> have=0 に設定 -> プログラムは直接終了

そのため、4番目のデータは表示されません。

プロシージャ p16() を作成する
始める
  row_gid int を宣言します。
  row_name varchar(20) を宣言します。
  row_num int を宣言します。
  have int default 1 を宣言します。
  getgoods カーソルを宣言して、goods から gid、name、num を選択します。
  NOT FOUND の終了ハンドラを宣言し、have:= 0 を設定します。
  getgoods を開きます。
  繰り返す 
    getgoods を row_gid、row_name、row_num にフェッチします。
  行名、行番号を選択します。
  have = 0 になるまで繰り返し終了;
  getgoodsを閉じる;
終了$

出力:

這里寫圖片描述

7. カーソルループを修正する

特殊なケースでは、読み込んだデータが空であったり、SQL 文にエラーがあったりすることがあります。このような状況は避けられないので、カーソル ループ操作を正しく使用する必要があります。

まず、カーソルを作成する必要があります。カーソルを開いた後、手動でデータ行をフェッチする必要があります。次に、ループを使用して、最初にコンテンツを処理してからフェッチします。このように、手動データ取得期間中にデータが得られなかった場合は、have = 0 が実行されます。repeat ループの場合は、repeat ループに入り、最初に null データが出力され、その後再度取得されます。このように、until まで実行されたらループを終了しますが、while ループの場合は while ループにはまったく入らず、1 行も出力されません。

(1)繰り返しループ:

プロシージャ p17() を作成する
始める
  row_gid int を宣言します。
  row_name varchar(20) を宣言します。
  row_num int を宣言します。
  have int default 1 を宣言します。
  getgoods カーソルを宣言し、gid、name、num を goods から選択します (0);
  NOT FOUND の継続ハンドラを宣言し、have:= 0 を設定します。
  getgoods を開きます。
  getgoods を row_gid、row_name、row_num にフェッチします。
  繰り返す 
  行名、行番号を選択します。
    getgoods を row_gid、row_name、row_num にフェッチします。
  have = 0 になるまで繰り返し終了;
  getgoodsを閉じる;
終了$

出力:

這里寫圖片描述

(2)whileループ:

プロシージャ p18() を作成する
始める
  row_gid int を宣言します。
  row_name varchar(20) を宣言します。
  row_num int を宣言します。
  have int default 1 を宣言します。
  getgoods カーソルを宣言し、gid、name、num を goods から選択します (0);
  NOT FOUND の継続ハンドラを宣言し、have:= 0 を設定します。
  getgoods を開きます。
  getgoods を row_gid、row_name、row_num にフェッチします。
  持っている = 1 する 
  行名、行番号を選択します。
    getgoods を row_gid、row_name、row_num にフェッチします。
  終了しながら;
  getgoodsを閉じる;
終了$

出力:

這里寫圖片描述

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL クエリ スキル」、「MySQL トランザクション操作スキル」、「MySQL ストアド プロシージャ スキル」、「MySQL データベース ロック関連スキルの概要」、および「MySQL 共通関数の概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL ストアド プロシージャ カーソル ループの使用の概要
  • MySQLカーソルの具体的な使い方の詳細な説明
  • MySQL ストアド プロシージャでカーソルを使用する例
  • SQL Server カーソルの簡単な例
  • MSSQL カーソルの使用経験
  • SQL Server カーソルの使用手順の例 (カーソルの作成、カーソルのクローズ)
  • SQLカーソルの例の共有の使い方を教えます
  • SQL におけるカーソルの基本的な使用例

<<:  Vue はインターフェースのスライド効果を実装します

>>:  Linuxの簡単な分析でファイアウォールの状態と外部に開いているポートの状態を確認する

推薦する

MySQLでよく使われる文字列関数トップ10の詳細な説明

こんにちは、みんな!技術の話ばかりで髪は切らないトニーです。データベース関数は、何らかの機能を持ち、...

Mysql | ワイルドカード(%、_ など)を使用したファジークエリの詳細な説明

ワイルドカードのカテゴリ: %パーセント ワイルドカード: 任意の文字が任意の回数出現できることを示...

Linuxにpipパッケージをインストールする方法

1. システムの Python バージョンに応じて、pip インストール パッケージをダウンロードし...

Linux IO 多重化 epoll ネットワーク プログラミング

序文この章では、基本的な Linux 関数と epoll 呼び出しを使用して、Linux 上で実行で...

MySQL エラー「すべての派生テーブルには独自のエイリアスが必要です」の解決方法

MySQL は、マルチテーブルクエリを実行するときにエラーを報告します。 [SQL] SELECT ...

高可用性 Web クラスターを実装するための Keepalived+Nginx+Tomcat サンプル コード

高可用性 Web クラスターを実現する Keepalived+Nginx+Tomcat 1. Ngi...

Linux TTY/PTS の違いの概要

キーボードで文字を入力すると、対応するプロセスにどのように送信されるのでしょうか? ps や who...

LinuxテキストエディタVimの詳しい説明

Vim は強力なフルスクリーン テキスト エディターであり、Linux/UNIX で最も一般的に使用...

要素テーブルの多層ネスト表示の実践

複数の注文を含むリストが必要です。各注文は一意にすることも、複数の注文を結合することもできます。各注...

学生情報管理システムを実装するためのJavaScript+HTML

目次1. はじめに2. レンダリング3. コード4. 学生情報管理システムのメインインターフェース1...

MySQLデータベースは重複データを削除し、メソッドインスタンスを1つだけ保持します

1. 問題の紹介ユーザー テーブルに 3 つのフィールドが含まれているシナリオを想定します。 id、...

VMware ESXi 5.5 の展開および構成図のプロセス

目次1. インストール要件2. OSイメージのダウンロード3. VMware Workstation...

Docker 経由で Redis 6.x クラスターをデプロイする方法

システム環境: Redis バージョン: 6.0.8 Docker バージョン: 19.03.12シ...

MySQL マスタースレーブレプリケーションの原理と注意点

前面に書かれた最近、Mycat で特別なトピックを書いています。最近、多くの友人が面接に出かけている...

mysql での rpm インストールの詳細な説明

インストールとアンインストールの表示 # rpm -qa | grep mysql を表示 # アン...