意味クエリの結果をトラバースし、トラバースされた各データを処理する必要がある状況に遭遇することがよくあります。このような場合にカーソルが使用されます。 カーソルの役割たとえば、上記の学生の場合、各ユーザーを走査し、他のコメントに基づいてポイントを加算または減算する必要があります。現時点では、すべての学生情報(成績を含む)を照会する必要があります。 学生から学生ID、学生名、スコアを選択します。 実行後、生徒データのセットが返されます。生徒データを 1 つずつ走査し、特定の状況に基づいてポイントを追加する必要がある場合は、カーソルを使用する必要があります。 カーソルの使用
注意: 使用される一時フィールドは、カーソルを定義する前に宣言する必要があります。 カーソルの宣言DECLARE cursor_name CURSOR FOR select_statement; カーソルを宣言します。サブルーチン内で複数のカーソルを定義することもできますが、ブロック内の各カーソルには一意の名前を付ける必要があります。カーソルを宣言した後も単一の操作になりますが、SELECT ステートメントには INTO 句を含めることはできません。 カーソルを開くOPEN カーソル名; 以前に宣言されたカーソルを開きます。 カーソルデータのトラバースFETCH cursor_name INTO var_list; このステートメントは、指定されたオープン カーソルを使用して次の行 (存在する場合) をフェッチし、カーソル ポインタを進めます。現在の行の結果を取得し、その結果を対応する変数に格納し、カーソル ポインターを次の行のデータにポイントします。 カーソルを閉じるカーソル名を閉じます。 使用後は必ずカーソルを閉じてください。 カーソルの例生徒の得点と追加ポイントの計算を含む関数を記述する データ基盤 mysql> 学生から * を選択します。 +-----------+-------------+--------+---------+ | 学生ID | 学生名 | スコア | クラスID | +-----------+-------------+--------+---------+ | 1 | ブランド | 97.5 | 1 | | 2 | ヘレン | 96.5 | 1 | | 3 | リン | 96 | 1 | | 4 | ソル | 97 | 1 | | 5 | b1 | 81 | 2 | | 6 | b2 | 82 | 2 | | 7 | c1 | 71 | 3 | | 8 | c2 | 72.5 | 3 | | 9 | ララ | 73 | 0 | | 10 | A | 99 | 3 | | 16 | テスト1 | 100 | 0 | | 17 | トリガー2 | 107 | 0 | | 22 | トリガー1 | 100 | 0 | +-----------+-------------+--------+---------+ 13行セット カーソルを使用する関数の記述 ここの注釈は非常に明確です マイSQL> /* 関数が存在する場合は削除します */ fun_test が存在する場合は関数を削除します。 /* 文の終わりは $*/ 区切り文字 $ /* 要件を満たす各学生にポイントを追加する関数を作成します。追加されるポイントは、指定された値 max_score を超えることはできません。*/ 関数 fun_test(max_score 小数点(10,2)) を作成します。 戻り値 int 始める /*リアルタイムの StudentId 変数を定義する*/ var_studentId int を DEFAULT 0 として宣言します。 /*計算されたスコアの変数を定義します*/ var_score を10進数(10,2)で宣言します。デフォルトは0です。 /*カーソル終了マーク変数を定義する*/ var_done int を DEFAULT FALSE として宣言します。 /*カーソルを作成する*/ DECLARE cur_test CURSOR FOR SELECT studentid,score from students where classid<>0; /*カーソルが終了すると、var_done が true に設定されます。var_done を使用して、カーソルが後で終了したかどうかを判断できます。*/ NOT FOUND SET var_done=TRUE の継続ハンドラーを宣言します。 /*カーソルを開く*/ cur_test を開きます。 /*カーソルをループするにはLoopを使用します*/ select_loop:ループ /*まず現在の行のデータを取得し、次に現在の行のデータをvar_studentId、var_scoreに格納します。データ行がない場合、var_doneはtrueに設定されます*/ cur_test を var_studentId、var_score にフェッチします。 /*var_done を使用してカーソルが終了したかどうかを判断し、ループを終了します*/ var_doneの場合 select_loopを終了します。 終了の場合; /* var_score 値にランダムな値を追加します。この値は指定されたスコアを超えることはできません。*/ var_score = var_score + LEAST(ROUND(rand()*10,0),max_score); を設定します。 学生を更新します。score = var_score を設定します。ただし、studentId = var_studentId です。 ループを終了; /*カーソルを閉じる*/ cur_test を閉じます。 /*結果を返す: 実際の状況に応じて必要なコンテンツを返すことができます*/ 1 を返します。 終了 $ /*終了文字は;に設定されています*/ 区切り文字 ; クエリは正常です。影響を受けた行は 0 行です 関数の呼び出し マイSQL> /* パラメータは 8 で、ボーナスポイントの上限が 8 であることを示します */ fun_test(8)を選択します。 +-------------+ | 楽しいテスト(8) | +-------------+ | 1 | +-------------+ セット内の1行 結果を見る 元のスコア値と比較すると、スコアにランダムな値が加算されていることがわかりますが、与えられたスコア8を超えていません。 mysql> 学生から * を選択します。 +-----------+-------------+--------+---------+ | 学生ID | 学生名 | スコア | クラスID | +-----------+-------------+--------+---------+ | 1 | ブランド | 105.5 | 1 | | 2 | ヘレン | 98.5 | 1 | | 3 | リン | 97 | 1 | | 4 | ソル | 97 | 1 | | 5 | b1 | 89 | 2 | | 6 | b2 | 90 | 2 | | 7 | c1 | 76 | 3 | | 8 | c2 | 73.5 | 3 | | 9 | ララ | 73 | 0 | | 10 | A | 100 | 3 | | 16 | テスト1 | 100 | 0 | | 17 | トリガー2 | 107 | 0 | | 22 | トリガー1 | 100 | 0 | +-----------+-------------+--------+---------+ 13行セット トリガーログを表示 条件を満たしスコアが変更されたデータは 9 件あり、すべてトリガーによってログに記録されています。 マイSQL> /*前回の記事では、students テーブルが変更されたときにログをトリガーするトリガーを作成しました*/ トリガーログから * を選択します。 +----+--------------+--------------+-----------------------------------------+ | id | トリガー時間 | トリガーイベント | メモ | +----+--------------+--------------+-----------------------------------------+ | 1 | 後 | 挿入 | 新しい学生情報、ID:21 | | 2 | 後 | 更新 | 学生情報を更新、ID:21 | | 3 | 後 | 更新 | 学生情報を削除、ID:21 | | 4 | 更新後 | から:test2,101.00 へ:trigger2,106.00 | | 5 | 更新後 | トリガー 2,106.00 からトリガー 2,107.00 へ | | 6 | 後 | 更新 | 学生情報を削除、ID:11 | | 7 | 更新後 | from:brand,97.50 to:brand,105.50 | | 8 | 更新後 | から:helen,96.50 へ:helen,98.50 | | 9 | 更新後 | from:lyn,96.00 to:lyn,97.00 | | 10 | 更新後 | from:sol,97.00 to:sol,97.00 | | 11 | 更新後 | から:b1,81.00 へ:b1,89.00 | | 12 | 更新後 | から:b2,82.00 へ:b2,90.00 | | 13 | 更新後 | から:c1,71.00 へ:c1,76.00 | | 14 | 更新後 | c2,72.50 から c2,73.50 へ | | 15 | 更新後 | から:A,99.00 へ:A,100.00 | +----+--------------+--------------+-----------------------------------------+ 15行セット カーソル実行プロセス 上記の例に従って、このカーソルの実行プロセスを分析します。 要約する1. カーソルはクエリ結果を移動するために使用されます。 上記はMySQLカーソルの詳細な分析です。MySQLカーソルの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
まず、「LISTENING」状態の TCP ソケットには 2 つの独立したキューがあることを理解する...
MySQL では、datetime 型は通常、時間を保存するために使用されますが、現在では多くのシス...
ウェブサイトにとって、これは最も基本的な機能です。それでは、登録プロセスに含まれる手順を見てみましょ...
この記事では、参考までに、Vue+Vant のトップ検索バーを実装するための具体的なコードを紹介しま...
ミラーリングも Docker のコアコンポーネントの 1 つです。ミラーリングはコンテナ操作の基盤で...
最初のステップは、Python のバージョン番号とインストール パスを確認することです。 上記のビュ...
目次1. 簡単な紹介2. スクリーンショットを実行する3. コードの紹介4. まとめ1. 簡単な紹介...
目次Tomcat8のインストールと設定方法tomcat ダウンロードTomcat マネージャーを有効...
この記事では、WeChatアプレットのレコード機能を実装するための具体的なコードを参考までに紹介しま...
目次1. UDPとLinuxの基礎の紹介2. 各機能の使い方1. ソケット機能の使用2. バインド機...
目次MVCとMVVMの違い前述のMVCC の概要長所と短所MVVM概要MVVM 実装者 — Vue ...
clear:both清除浮動これは私が常に持っていた印象ですが、私はこれをめったに使用せず、私の理...
困難SVG グラフィックの 2 つのマスクの作成まず、コード左側のピンク色のボックスの内容ですこれに...
テーブルが 2 つあり、テーブル A のレコードがテーブル B に存在しない可能性があります。左結合...
目次1. Redis Dockerベースイメージを作成する2. Redisノードイメージを作成する3...