MySQLカーソルの詳細な紹介

MySQLカーソルの詳細な紹介

1. カーソルとは何ですか?

スクリーニング条件 WHERE および HAVING またはキーワード LIMIT を使用して返されるレコードを制限することによってレコードを返すこともできますが、ポインターのように結果セット内でレコードを前方または後方に検索したり、隨意定位到某一條記錄レコードのデータを処理したりすることはできません。

このときカーソルが使えます。カーソルは柔軟な操作モードを提供し、結果セット内の各レコードを検索し、指定されたレコード内のデータを操作することができます。カーソルは、セット指向言語である SQL にプロシージャを開発する機能を提供します。

SQL では、カーソルは、データベース テーブルに格納されているデータの行を指すことができる一時的なデータベース オブジェクトです。ここで、カーソルは充當了指針的作用。カーソルを操作することで、データ行を操作できますMySQL中游標可以在存儲過程和函數中使用

たとえば、従業員テーブルをクエリして、給与が 15,000 を超える従業員を検索します。

従業員から従業員ID、姓、給与を選択します
給与 > 15000;

画像の説明を追加してください

ここでは、カーソルを使用してデータ行を操作できます。図に示すように、カーソルが配置されている行は「108」のレコードです。結果セット上でカーソルをスクロールして、結果セット内の任意の行を指すこともできます。

2. カーソルの使い方

カーソルはハンドラーの前に宣言する必要があり、変数と条件もカーソルまたはハンドラーの前に宣言する必要があります。

1. カーソルを宣言する

構文形式:

DECLARE カーソル名 CURSOR FOR クエリ ステートメント;

SELECT ステートメントを使用してデータ結果セットを取得しますが、この時点ではまだデータはまだ走査されていません。ここでのクエリ ステートメントは、返回一個用于創建游標的結果集

例:

emp_curカーソルを宣言する 
従業員から従業員ID、給与を選択します。

2.カーソルを開く

構文形式:

OPEN カーソル名;

カーソルを定義した後、カーソルを使用する場合は、まずカーソルを開く必要があります。カーソルが開かれると、SELECT ステートメントのクエリ結果セットがカーソル ワークスペースに送信され、後続のカーソルが逐條讀取準備が整います。

3. カーソルを使用する

構文形式:

FETCH cursor_name INTO var_name [, var_name] ...

このステートメントの機能は、游標名使用して現在の行を読み取り、データを変数 var_name に保存し、カーソルを次の行にポイントすることです。カーソルによって読み取られるデータ行に複数の列名がある場合は、INTO キーワードの後に​​複数の変数名を割り当てることができます。

注意:カーソルを宣言する前に var_name を定義する必要があります。

例:

emp_cur を emp_id、emp_sal にフェッチします。

注意:カーソル クエリ結果セット内のフィールド数は、INTO 後の変数の数と一致している必要があります。

4. カーソルを閉じる

構文形式:

CLOSE カーソル名;

カーソルの使用が終わったら、カーソルを閉じる必要があります。カーソルは占用系統資源ため、時間内に閉じないと、ストアド プロシージャが終了するまでカーソルが残り、システム操作の効率に影響します。カーソルを閉じると、カーソルによって占有されていたシステム リソースが解放されます。

カーソルを閉じると、クエリ結果のデータ行を取得できなくなります。取得する必要がある場合は、カーソルを再度開くしかありません。

3. コード例

#ストアドプロシージャ「get_count_by_limit_total_salary()」を作成します。
# DOUBLE 型の IN パラメータ limit_total_salary を宣言し、INT 型の OUT パラメータ total_count を宣言します。
#この関数は、給与が最も高い従業員の給与値を合計することができます。
#給与総額がlimit_total_salaryパラメータの値に達するまで、累計人数をtotal_countに返します。

区切り文字 $
CREATE PROCEDURE get_count_by_limit_total_salary(IN limit_total_salary DOUBLE, OUT total_count INT)
始める
	DECLARE count_emp INT DEFAULT 0; #人数を記録するために使用します。デフォルト値は0です
	DECLARE sum_sal DOUBLE DEFAULT 0; #給与総額を記録する DECLARE one_sal DOUBLE DEFAULT 0; #1人の給与を記録する	
	# クエリされた給与結果セットを高いものから低いものの順に並べ替えるカーソルを宣言します。DECLARE emp_cur CURSOR FOR SELECT salary FROM employees ORDER BY salary DESC;
	
	OPEN emp_cur; #カーソルを開く	
	# 合計給与が質問の要件を満たすまでループ文を使用して走査します。繰り返し
		#カーソルの使用を開始します FETCH emp_cur INTO one_sal;
		
		sum_sal = sum_sal + one_sal を設定します。
		count_emp = count_emp + 1 を設定します。
		
		合計給与 >= 合計給与の上限まで
		
	繰り返し終了;
	CLOSE emp_cur; #カーソルを閉じる	
	#結果をtotal_countに返す
	count_emp を total_count に選択します。
終了 $
区切り文字 ;

get_count_by_limit_total_salary(30000,@count) を呼び出します。
@count を選択;

思考分析:まずストアド プロシージャを作成し、実際の状況に応じて必要な変数を宣言して、問題の要件を満たします。カーソルは、カーソルを開き、カーソルを使用し、最後にカーソルを閉じるという手順で作成する必要があります。ループ内でカーソルを使用することに注意して、コードのシンプルさを向上させます。

4. まとめ

カーソルは MySQL の重要な機能であり、逐條讀取ための完璧なソリューションを提供します。アプリケーション レベルで同じ機能を実装する場合と比較すると、カーソルはストアド プロシージャで使用できるため、効率が向上し、プログラムもシンプルになります。

ただし、パフォーマンスの問題もいくつか発生します。たとえば、カーソルを使用すると、データ行が加鎖ます。ビジネスの同時実行性が大きい場合、これはビジネス間の効率に影響を与えるだけでなく、消耗系統資源、メモリ不足を引き起こします。これは、カーソルがメモリ内で処理されるためです。

推奨事項:システム全体の効率を向上させるために、使用後は必ず閉じる習慣をつけてください。

最後に愛をこめて:カーソルの使用は、これまで学習したストアド プロシージャ、プロセス制御、およびユーザー定義変数に関する知識ポイントを組み合わせたものです。カーソルの知識ポイントだけを見ても難しくはありません。これまで学習した知識ポイントを復習し、徹底的に理解する必要があります。

これで、MySQL カーソルの詳細な紹介に関するこの記事は終了です。MySQL カーソルに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLでカーソルトリガーを使用する方法
  • MySQL カーソル関数と使用法
  • MySQL カーソルの定義と使用法
  • MySQLでカーソルを宣言する方法

<<:  Nginx を使用してポート転送 TCP プロキシを実装する例

>>:  レスポンシブデザインについての簡単な説明

推薦する

VMware 仮想マシンでの CentOS7 ネットワーク構成 (ホストのワイヤレス インターネット アクセス)

CentOS7 システムを使用するのは今回が初めてで、ネットワーク構成を行う際に多くの問題が発生し...

JavaScript が Xiaomi のカルーセル効果を模倣

この記事は、透明度を変えてカルーセルにするXiaomiカルーセルを真似て書いたものです。初心者なので...

mysql zipファイルのインストールチュートリアル

この記事では、参考までにMySQL zipファイルをインストールする具体的な方法を紹介します。具体的...

Prometheusコンテナのデプロイメントのための実用的なソリューション

環境ホスト名IPアドレス仕えるプロメテウス192.168.237.137プロメテウス、グラファナノー...

CSS 透明ボーダー背景クリップマジック

この記事では、CSSの透明な境界線の背景クリップの素晴らしい使い方を主に紹介し、みんなと共有し、自分...

HTML 名、ID、クラス (フォーマット/アプリケーション シナリオ/機能) などの違いの紹介。

ページには多くのコントロール (要素またはタグ) があります。これらのタグをより便利に操作するには、...

MySql はコミットする必要がありますか?

MySQL が挿入などの操作を実行するときにコミットする必要があるかどうかは、ストレージ エンジン...

MacでMysqlのルートパスワードを忘れた場合の解決方法

長い間コンピューターで mysql を使用していなかったので、パスワードを忘れてしまいました。でも、...

MySQL のデータ統計に関するヒント

よく使用されるデータベースである MySQL では、多くの操作が必要です。デジタル操作には非常に便利...

CSS 疑似要素を使用して複数の連続する要素のスタイルを制御する方法

CSS 疑似要素を使用して要素を制御する場合、一部の要素のスタイルを変更する必要があることがよくあり...

Vue再帰コンポーネントの簡単な使用例

序文多くの学生は既に再帰に精通していると思います。アルゴリズムの問​​題を解決するために再帰がよく使...

MySQLにインデックスを追加する方法

インデックスの簡単な紹介は次のとおりです。インデックスを追加する目的は、データベース クエリのパフォ...

MySQL マスタースレーブスイッチチャネルの問題の解決策

VIP を設定した後、アクティブ/スタンバイの切り替え中に表示されるエラー メッセージは次のとおりで...

VueプロジェクトでReactを書く方法の詳細

jsx/tsxファイルを直接作成できます今回のプロジェクト構成は以下のとおりです。 vueファイルで...

MySql で、存在しない場合は挿入し、存在する場合は更新する方法

まとめシナリオによっては、レコードがない場合は挿入し、レコードがある場合は更新するという要件がある場...