mysql では、カーソルはポインタとして機能し、主に、対応する操作を実行するためにデータベースへのクエリによって返されたレコード結果セットを走査するために使用されます。カーソルは実際には、複数のデータ レコードを含む結果セットから一度に 1 つのレコードを抽出するメカニズムです。リレーショナル データベース管理システムは本質的にセット指向です。MySQL では、WHERE 句を使用して選択するレコードを 1 つだけ制限する場合を除き、テーブル内の単一レコードを記述する式形式がありません。そのため、場合によってはカーソルを使用する必要があります。単一のレコードを選択するデータ処理。
このチュートリアルの動作環境: Windows7 システム、mysql8 バージョン、Dell G3 コンピューター。
MySQL カーソル (カーソル)
カーソルは実際には、複数のレコードを含む結果セットから一度に 1 つのレコードを抽出できるメソッドです。データレコード、メカニズム。
カーソルはポインタとして機能します。
カーソルは結果内のすべての行を移動できますが、一度に指定できるのは 1 行のみです。
カーソルの機能は、対応する操作を実行するために、クエリ データベースから返されたレコードを走査することです。
リレーショナル データベース管理システムは本質的にセット指向です。MySQL では、WHERE 句を使用して 1 つのレコードのみを制限する場合を除き、テーブル内の 1 つのレコードを記述する式形式がありません。選択されました。したがって、場合によっては、単一レコードのデータを処理するためにカーソルを使用する必要があります。
一般に、カーソルは、データ変更のために結果セットの特定の行を見つけるために使用されます。
カーソルの使用法
1. カーソルを宣言します: 宣言カーソル名 CURSOR for table;
(table here Itクエリする任意のコレクションにすることができます)
2. 定義されたカーソルを開きます: open カーソル名;
3. データの次の行を取得します:FETCH カーソルtestrangeid,versionid に名前を付けます;
4. 実行する必要があるステートメント (追加、削除、変更、確認): これは特定の状況によって異なります
5. カーソルを放します:CLOSE カーソル名 ;
注: mysql ストアド プロシージャの各文は; で終わる必要があり、使用される一時フィールドはカーソルを定義する前に宣言する必要があります。
例
- BEGIN --定义变量 declare testrangeid BIGINT; declare versionid BIGINT; declare done int; --创建游标,并存储数据 declare cur_test CURSOR for select id as testrangeid,version_id as versionid from tp_testrange; --游标中的内容执行完后将done设置为1 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; --打开游标 open cur_test; --执行循环 posLoop:LOOP --判断是否结束循环 IF done=1 THEN LEAVE posLoop; END IF; --取游标中的值 FETCH cur_test into testrangeid,versionid; --执行更新操作 update tp_data_execute set version_id=versionid where testrange_id = testrangeid; END LOOP posLoop; --释放游标 CLOSE cur_test; END -
例 2:
これからストアド プロシージャを使用して、カウントする関数を作成します。 iPhone の総インベントリの値はいくらであり、その合計をコンソールに出力します。
--在windows系统中写存储过程时,如果需要使用declare声明变量,需要添加这个关键字,否则会报错。 delimiter // drop procedure if exists StatisticStore; CREATE PROCEDURE StatisticStore() BEGIN --创建接收游标数据的变量 declare c int; declare n varchar(20); --创建总数变量 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 --根据游标当前指向的一条数据 fetch cur into n,c; --判断游标的循环是否结束 if done then leave read_loop; --跳出游标循环 end if; --获取一条数据时,将count值进行累加操作,这里可以做任意你想做的操作, set total = total + c; --结束游标循环 end loop; --关闭游标 close cur; --输出结果 select total; END; --调用存储过程 call StatisticStore();
fetch は、カーソルが現在指しているデータ行を取得し、ポインタを次の行に向けることです。カーソルがすでに最後の行を指しているときに実行を続けると、カーソル オーバーフローが発生します。
ループ カーソルを使用する場合、データの最後の部分に到達したかどうかは監視されません。次のコードを書くと無限ループが発生します。
read_loop:loop fetch cur into n,c; set total = total+c; end loop;
MySql では、カーソルが MySQL の事前定義された NOT をオーバーフローすると、 FOUND エラーがトリガーされるため、上記のコードは、not found エラーが発生したときに continue イベントを指定し、このイベントが発生したときに Done 変数の値を変更するために使用されています。
declare continue HANDLER for not found set done = true;
したがって、次のコードがループに追加されます:
--判断游标的循环是否结束 if done then leave read_loop; --跳出游标循环 end if;
done の値が true の場合、ループを終了します。次のコードを実行し続けます。
使用方法
カーソルを使用するには 3 つの方法があります。
最初の実装は、loop ループを使用する上記の実装です。 ;
2 番目の方法は、while ループを使用するものです:
drop procedure if exists StatisticStore1; CREATE PROCEDURE StatisticStore1() BEGIN declare c int; declare n varchar(20); 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; fetch cur into n,c; while(not done) do set total = total + c; fetch cur into n,c; end while; close cur; select total; END; call StatisticStore1();
3 番目の方法は、繰り返し実行を使用するものです:
drop procedure if exists StatisticStore2; CREATE PROCEDURE StatisticStore2() BEGIN declare c int; declare n varchar(20); 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; repeat fetch cur into n,c; if not done then set total = total + c; end if; until done end repeat; close cur; select total; END; call StatisticStore2();
カーソルの入れ子
mysql では、begin end ブロックはそれぞれ独立したスコープ領域となっており、MySql では同じエラーイベントを複数回定義しても 1 回しか定義できないため、 , コンパイル時に、同じブロックで宣言された Duplicate ハンドラーを要求するメッセージが表示されます。
drop procedure if exists StatisticStore3; CREATE PROCEDURE StatisticStore3() BEGIN declare _n varchar(20); declare done int default false; declare cur cursor for select name from store group by name; declare continue HANDLER for not found set done = true; open cur; read_loop:loop fetch cur into _n; if done then leave read_loop; end if; begin declare c int; declare n varchar(20); 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; iphone_loop:loop fetch cur into n,c; if done then leave iphone_loop; end if; set total = total + c; end loop; close cur; select _n,n,total; end; begin declare c int; declare n varchar(20); declare total int default 0; declare done int default false; declare cur cursor for select name,count from store where name = 'android'; declare continue HANDLER for not found set done = true; set total = 0; open cur; android_loop:loop fetch cur into n,c; if done then leave android_loop; end if; set total = total + c; end loop; close cur; select _n,n,total; end; begin end; end loop; close cur; END; call StatisticStore3();
上記はネストされたループを実装するものですが、もちろん、この例は突飛です。ちょっと見てください。
動的 SQL
Mysql は動的 SQL 関数をサポートしています
set @sqlStr='select * from table where condition1 = ?'; prepare s1 for @sqlStr; --如果有多个参数用逗号分隔 execute s1 using @condition1; --手工释放,或者是 connection 关闭时, server 自动回收 deallocate prepare s1;
[関連する推奨事項: mysql ビデオ チュートリアル ]
以上がmysqlカーソルの用途は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。