[mysqlカーソルの使い方と機能] 例: 現在、テーブル A、B、C の 3 つのテーブルがあります。A と B は 1 対多の関係にあり、B と C は 1 対多の関係にあります。ここで、テーブル B のテーブル A の主キーをテーブル C に格納する必要があります。 【導入】 カーソルは、実際には、複数のデータ レコードを含む結果セットから一度に 1 つのレコードを抽出できるメカニズムです。 カーソルはポインターとして機能します。 カーソルは結果セット内のすべての行を走査できますが、一度にポイントできるのは 1 行だけです。 カーソルの機能は、クエリ データベースによって返されたレコードを走査して、対応する操作を実行することです。 【使用法】 1. カーソルを宣言します: カーソル名 CURSOR for table; を宣言します (ここでのテーブルは、クエリする任意のコレクションにすることができます) 注意: 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 つあります。 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の他の関連記事もご覧ください。 以下もご興味があるかもしれません:
|
<<: Zabbixで指定時間内の変化値を設定する方法の詳細な説明
>>: Vueはファイルのアップロードとダウンロード機能を実装します
序文この記事では、山括弧のその他の用途をさらに詳しく見ていきます。前回の記事では、山括弧 (<...
はじめに: MySQL では、CONCAT() 関数を使用して複数の文字列を 1 つの文字列に連結し...
mysqlのリモートアクセス権を有効にするデフォルトでは、MySQL ユーザーにはリモート アクセス...
数秒後に広告が表示されて消えることがよくあります。この機能を実装するには、JQuery フレームワー...
MySQL 6.1.3 をベースにした 8.0.13 をインストールします。 MySQL 8.0....
この記事では、適切な形式を使用して IP アドレス データをデータベースに保存し、IP アドレスを簡...
効果 HTML を実装するには、まずクリーンな HTML ページを準備し、ノードを記述します。 &l...
今日、redis をインストールしたところ、今までになかったいくつかのエラーが発生しました。ここで記...
transform:scale()比例したズームインまたはズームアウトを実現できます。 transi...
フロントエンドとバックエンドがやり取りする場合、get または delete を介してバックエンドに...
01. VMware Workstation Pro 15 のダウンロードダウンロード: VMwa...
NextCloud コンピュータ上の任意のファイルやフォルダを共有し、NextCloud サーバーと...
目次概要コンソールログコンソール.infoコンソール.警告コンソールエラーコンソールテーブルコンソー...
目次1. $(".box1").click() メソッドを実装する2. $(&q...
01. コマンドの概要実際には、locate コマンドは find -name の別の書き方ですが、...