Mysqlのラベルの使い方と役割を詳しく説明します。
[mysqlラベルの使い方と役割]
例:
現在は3つのテーブルA、B、Cがあります。そのうちAとBは一対の多関係です。BとCは一対の多関係です。今はBのAテーブルのメインキーをCに保存します。
基本的な考え方はBの中から検索して、udate文を通じてCテーブルを更新すればいいですが、Bの表には2000以上のデータがあります。
2000回以上実行しますか?明らかに非現実的です。最終的に保存プロセスを見つけて、それから循環によってCテーブルを更新します。
しかし、記憶過程での書き方は、遊びの形式である。
【あらすじ】
実際には、複数のデータ記録を含む結果から、毎回1つのレコードを抽出することができる仕組みである。
遊標は針として作用する。
旅行標識は結果のすべての行を遍歴することができますが、彼は一回に一行だけを指します。
ラベルの役割は、クエリーデータベースから返されたレコードを巡回して、対応する操作を行うことです。
【用法】
一、一つの遊覧標識を宣言します。declareの遊標名称CURSOR for table;ここのテーブルはあなたが調べた任意の集合です。
二、定義された遊標を開く:open遊標名称;
三、次の行のデータを獲得します。FETCHランドの名前はinto testranged、versionidです。
四、実行したい語句(添削・修正):ここは具体的な状況によって決められます。
五、遊標を解放する:CLOSE遊標名称;
注:mysql格納プロセスは、各文の後に必ず使われます。最後に使用する一時フィールドは、ラベルを定義する前に宣言する必要があります。
【例】
私たちは今メモリプロセスを使って機能を作りたいです。iphoneの総在庫を統計して、全部をコンソールに出力します。
loopループを使用している場合、彼自身は最後のデータまで監視しないです。次のコードのような書き方をすると、デッドサイクルになります。
使い方
ラベルには3つの使用方法があります。
一つ目は上の実現です。loopループを使います。
第二の方式は以下の通りで、whileサイクルを使用する。
mysqlの中で、begin endブロックは独立したscopeエリアです。MySqlの中で同じerrorのイベントは一回しか定義できないので、もし多く定義すればDuplicate handler declead in the same blockをコンパイルする時に提示します。
ダイナミックSQL
MysqlはダイナミックSQLの機能をサポートしています。
例:
現在は3つのテーブルA、B、Cがあります。そのうちAとBは一対の多関係です。BとCは一対の多関係です。今はBのAテーブルのメインキーをCに保存します。
基本的な考え方はBの中から検索して、udate文を通じてCテーブルを更新すればいいですが、Bの表には2000以上のデータがあります。
2000回以上実行しますか?明らかに非現実的です。最終的に保存プロセスを見つけて、それから循環によってCテーブルを更新します。
しかし、記憶過程での書き方は、遊びの形式である。
【あらすじ】
実際には、複数のデータ記録を含む結果から、毎回1つのレコードを抽出することができる仕組みである。
遊標は針として作用する。
旅行標識は結果のすべての行を遍歴することができますが、彼は一回に一行だけを指します。
ラベルの役割は、クエリーデータベースから返されたレコードを巡回して、対応する操作を行うことです。
【用法】
一、一つの遊覧標識を宣言します。declareの遊標名称CURSOR for table;ここのテーブルはあなたが調べた任意の集合です。
二、定義された遊標を開く:open遊標名称;
三、次の行のデータを獲得します。FETCHランドの名前はinto testranged、versionidです。
四、実行したい語句(添削・修正):ここは具体的な状況によって決められます。
五、遊標を解放する: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は、現在のビューが指しているデータ行を取得し、次の行にポインタを向けて、最後の行に向かっているときに実行を続けると、ビーコンがオーバーフローします。loopループを使用している場合、彼自身は最後のデータまで監視しないです。次のコードのような書き方をすると、デッドサイクルになります。
read_loop:loop
fetch cur into n,c;
set total = total+c;
end loop;
MySqlでは、ラベルオーバー時にmysql定義のNOT FOUNDエラーが発生するので、上のコードを使ってnot foundエラーが発生したときにcontiueを定義するイベントを指定して、このイベントが発生したときにdone変数の値を変更します。
declare continue HANDLER for not found set done = true;
したがって、ループ時に以下のコードを追加しました。
--
if done then
leave read_loop; --
end if;
doneの値がtrueであれば、ループは終了します。次のコードを実行し続けます。使い方
ラベルには3つの使用方法があります。
一つ目は上の実現です。loopループを使います。
第二の方式は以下の通りで、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();
第三の方法はrepeatを用いて実行することである。
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ブロックは独立したscopeエリアです。MySqlの中で同じerrorのイベントは一回しか定義できないので、もし多く定義すればDuplicate handler declead in the same blockをコンパイルする時に提示します。
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の游び标に関する资料は他の関连する文章に注目してください。