この記事では、例を使用して MySQL カーソルの概念と使用方法を説明します。ご参考までに、詳細は以下の通りです。 1. カーソルの概念(カーソル)
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カーソルでは、範囲外フラグを操作するために 文法: 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. 続行と終了の違い
exit を使用して continue を置き換えます。 ループカーソル -> 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. カーソルループを修正する
まず、カーソルを作成する必要があります。カーソルを開いた後、手動でデータ行をフェッチする必要があります。次に、ループを使用して、最初にコンテンツを処理してからフェッチします。このように、手動データ取得期間中にデータが得られなかった場合は、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データベース設計に役立つことを願っています。 以下もご興味があるかもしれません:
|
<<: Vue はインターフェースのスライド効果を実装します
>>: Linuxの簡単な分析でファイアウォールの状態と外部に開いているポートの状態を確認する
目次デモ1フラグメントの作成スヴェルトコンポーネント状態を変更できるデモSvelte は長い間存在し...
ポップアップニュースは国内のインターネットサービスでは一般的であり、リアルタイムプッシュ方式はウェブ...
要件は次のとおりですテーブル構造、フィールドコメント情報、テーブル名などをエクスポートします。これは...
この記事では、例を使用して、MySQL ストアド プロシージャを作成 (CREATE PROCEDU...
<br />何の警告もなく、cnBeta で TOM.COM の Web サイトが再設計...
MySQL データベースでは、あいまいクエリが必要な場合にワイルドカードを使用します。まず、演算子と...
目次グローバルオブジェクトグローバルオブジェクトとグローバル変数プロセスコンソール一般的なツールユー...
MYSQL を使用する場合、トリガーがよく使用されますが、不適切な使用によって問題が発生する場合が...
最近、データベース データのスケジュールされた移行を実行する必要があります。実行プロセス中に何らかの...
CenOS6.7 は MySQL8.0.22 (推奨コレクション) をインストールします1. MyS...
2 つ以上のブロックレベル ボックスの垂直に隣接するエッジが重なり合っています。結果として得られる境...
目次1. JavaScriptはシングルスレッドです1. 同期タスク2. 非同期タスク2. タスクキ...
translate と transition は非常に強力で、習得するのは不可能だといつも感じていま...
1. MySQLリポジトリソースをダウンロードする$ wget http://repo.mysql....
MySQLデータベースの基本構文DDL操作データベース作成構文: create database デ...