意味クエリの結果をトラバースし、トラバースされた各データを処理する必要がある状況に遭遇することがよくあります。このような場合にカーソルが使用されます。 カーソルの役割たとえば、上記の学生の場合、各ユーザーを走査し、他のコメントに基づいてポイントを加算または減算する必要があります。現時点では、すべての学生情報(成績を含む)を照会する必要があります。 学生から学生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の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
目次1. 使用2. メッセージポップアップウィンドウが繰り返し表示される問題を解決する1. 使用Vu...
最近、React プロジェクトで初めてhtml-webapck-pluginプラグインを使用しました...
目次1.parseInt(文字列、基数) 2. 数値() 3.parseFloat()主なメソッドは...
title: vue は vue-meta-info を使用して各ページのタイトルとメタ情報を設定...
目次js のイベントイベントタイプ一般的なイベントイベント登録静的および動的登録の例onload 読...
MySQL では lastIndexOf に似た関数を使用する必要がある場合もありますが、すぐに使用...
数日前、同僚からMySQLのインデックスについて質問を受けました。大体わかっているのですが、まだ練習...
今日、突然、自分のウェブページで Google や Baidu のような強力な検索エンジンを呼び出す...
この記事では、Webオンラインチャットを実装するためのVueの具体的なコードを参考までに紹介します。...
目次1. 反応する基本的な使い方注目すべき機能クラスコンポーネント仮想DOMライフサイクルメソッドJ...
この記事では、クリックするとランダムグラフィックの生成を実現するJavaScriptの具体的なコード...
RedHat6.5インストールMySQL5.7チュートリアル共有、参考までに、具体的な内容は次のとお...
目次序文動的プロパティとは何ですか?値のコピー値の種類を決定する要約する序文これは JavaScri...
1. nginx仮想ホストの設定仮想ホストを使用すると、実行する Web サイトごとに個別の Ngi...
データをオペレーションにエクスポートする場合、フィールドの結合は避けられません。MySQL でこれが...