1. 程式人生 > >MySql 觸發器 迴圈遍歷

MySql 觸發器 迴圈遍歷

由於在做專案的時候遇到了,需要能遍歷表的觸發器,但是對語法不是很熟悉,今天就在這個做個筆記,也一起研究研究,大家有什麼問題都可以提,我能jie。下面是完整示例程式碼,並加了註釋:

1.使用遊標的方法遍歷—repeat until

DROP TRIGGER `saa`;
CREATE TRIGGER `saa` AFTER INSERT ON `user`
FOR EACH ROW begin  
  declare user varchar(255); /*定義屬性*/
  declare  pwd varchar(255); 

 declare Done int DEFAULT 0;/*判斷迴圈是否關閉的標誌位*/
declare prd_code VARCHAR(255); /*定義遊標 以及賦值 如果多個值就注意下游標取值*/ declare result cursor for select id from user; /*定義異常處理 */ declare continue handler for not found set Done =1; /*開啟遊標*/ open result ; /*提取遊標的值 多個值的時候: fetch xxx into xxx,xxx */ fetch result into prd_code; /*迴圈開始*/ repeat /*TODO 根據使用者id獲取資訊,存儲存到另一張表*/
select login_name,login_password into user,pwd from user where id=prd_code; insert into online(user,name) values(user,pwd); fetch result into prd_code; until Done = 1 end repeat ;/*關閉迴圈*/ close result ;/*關閉遊標*/ end;

2.使用遊標的方法遍歷—loop

begin  
  declare user varchar(255); /*定義屬性*/
  declare  pwd varchar(255); 

 declare Done int DEFAULT 0;/*判斷迴圈是否關閉的標誌位*/
declare prd_code VARCHAR(255); declare prd_usr VARCHAR(255); /*定義遊標 以及賦值*/ declare result cursor for select id,login_name from user; /*定義異常處理 */ declare continue handler for not found set Done =1; /*開啟遊標*/ open result ; /*迴圈開始*/ flag_loop:loop /*提前遊標的值 多個值的時候: fetch xxx into xxx,xxx */ fetch result into prd_code,prd_usr ; /*宣告結束的時候*/ if Done then leave flag_loop ; end if ; /*TODO 根據使用者id獲取資訊,存儲存到另一張表*/ select login_name,login_password into user,pwd from user where id=prd_code; insert into online(user,name) values(user,pwd); end loop flag_loop; /*迴圈結束*/ close result ;/*關閉遊標*/ end

3.使用遊標的方法遍歷—while do

語法:[label:]while 條件 do /TODO/ end while [label]

begin  
  declare user varchar(255); /*定義屬性*/
  declare  pwd varchar(255); 

 declare Done int DEFAULT 0;/*判斷迴圈是否關閉的標誌位*/
 declare prd_code VARCHAR(255); 
 declare prd_usr VARCHAR(255);
/*定義遊標 以及賦值*/
 declare result cursor for select id,login_name from user;
/*定義異常處理 */
 declare continue handler for not found set Done =1; 
/*開啟遊標*/
 open  result ;

/*迴圈開始*/
flag_while:while Done=0 do
  /*提前遊標的值  多個值的時候: fetch xxx into xxx,xxx */
   fetch  result into prd_code,prd_usr ; 
   /*宣告結束的時候*/
   if Done=1 then leave flag_while ; end if ;
   /*TODO 根據使用者id獲取資訊,存儲存到另一張表*/
    select login_name,login_password into user,pwd  from user where id=prd_code; 
    insert into online(user,name) values(user,pwd);
 end while flag_while;  /*迴圈結束*/
 close result ;/*關閉遊標*/
end

總結

其實 loop 跟while 的用法都差不多,repeat 的就小心點了,遊標迴圈取值會有點麻煩。。。祝大家學習愉快!