Mysqlのラベルの使い方と役割を詳しく説明します。

7045 ワード

[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格納プロセスは、各文の後に必ず使われます。最後に使用する一時フィールドは、ラベルを定義する前に宣言する必要があります。
【例】

- 
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の游び标に関する资料は他の関连する文章に注目してください。