2017-07-16 224 views
0

如何跳過遊標循環中的一行?如何在mysql觸發器中按條件跳過行?

我提到繼續;在上面的片段中。如果name ='siva',我想跳過。

CREATE TRIGGER `vdata_after_insert` AFTER INSERT ON `vdata` 
BEGIN 

declare v_name varchar(100); 
declare v_address varchar(100); 
declare v_city varchar(50); 
declare v_IdentityNO varchar(20) 
declare v_clientNo int 


declare cur1 cursor for 
     select name,Address,City,IdentityNO,clientNo 
     from temptable; 
declare continue handler for not found set done=1; 

    set done = 0; 
    open cur1; 
    igmLoop: loop 
     fetch cur1 into v_name,v_Address,v_City,v_IdentityNO,v_clientNo; 
     if done = 1 then leave igmLoop; end if; 
     if v_name = 'siva' then **CONTINUE**; 
     insert into audit(name, data) values(v_name, now()) 
    end loop igmLoop; 
    close cur1; 
END 

回答

0

從什麼MySQL documentation說,這是不可能的使用遊標時跳過行:

MySQL支持存儲程序中的光標。語法與嵌入式SQL中的一樣。遊標有下列特性:

敏感性未定型:服務器可能會或可能不會讓只讀其結果表
的副本:不可更新
不可滾動:可以只在一個方向遍歷,並且不能跳過行

但是,如果仔細觀察觸發器,您會看到有另一種方式可以在此處繼續。我想你可以改寫你的邏輯,只執行INSERT如果v_name'siva'

if v_name <> 'siva' then 
    insert into audit(name, data) values(v_name, now()) 
end if; 
-- if the name is 'siva' then just flow to the next row fetched from the cursor 

即使你的實際代碼比這個大很多,你可以總是那句IF語句,如果某些條件爲真,它只執行遊標迭代的所有部分。

+0

我只是舉例來說明我的問題。如果我改變邏輯,那麼我必須在該IF塊內維護非常大的代碼塊。 –

+0

@KumarSiva我不認爲這樣的構造存在於MySQL中,但即使它存在,也不需要使用它。你總是可以構造一個'IF'語句來跳過遊標中不應該執行給定獲取的代碼。 –

+0

你在說mysql沒有CONTINUE嗎? –