意味クエリの結果をトラバースし、トラバースされた各データを処理する必要がある状況に遭遇することがよくあります。このような場合にカーソルが使用されます。 カーソルの役割たとえば、上記の学生の場合、各ユーザーを走査し、他のコメントに基づいてポイントを加算または減算する必要があります。現時点では、すべての学生情報(成績を含む)を照会する必要があります。 学生から学生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の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
序文ご存知のとおり、nginx 構成ファイルは add_header ディレクティブを使用して応答ヘ...
MySQL データ型における DECIMAL の使用法の詳細な説明MySQL のデータ型には、INT...
最近、MySQL を始めとしてデータベースの知識を勉強し始めました。以下では、皆さんの参考になるよう...
大学院入試に備えて、C/C++ を使って基本的なデータ構造とアルゴリズムを実装する予定です。アルゴリ...
目次序文導入JavaScript 履歴 API独自のネイティブJSルーティングを実装するHistor...
1. トランザクションはACID特性を持つ原子性: トランザクションは、トランザクションによって分割...
目次1. 内閣府1. コンセプト2. MHAの構成3. MHAの特徴2. MySQL+MHAをビルド...
目次SQLを理解するSELECTを理解するエイリアス定数をクエリし、固定定数列を追加します。重複行を...
先日、外国人の方がHTML+CSSを使ってHamburgerMenuを実装している動画を見ました。最...
本日ご紹介するのは、jQuery を使用してシンプルなカルーセルを実装する方法です。実装の原則は次の...
最近、センタリングの問題に数多く遭遇したので、後で簡単に見つけられるように、時間をかけてそれらを要約...
この記事では、全選択と逆選択操作を実装するためのjQueryの具体的なコードを参考までに共有します。...
HTML には、幅の異なる 5 つのスペース エンティティが用意されています。非改行スペース ( )...
なぜテキストエリアについて具体的に言及するのでしょうか?なぜなら、textarea ノードは実際には...
複数テーブルクエリ複数のテーブルから関連するクエリ結果を取得するには、単一の SELECT ステート...