2016-09-16 89 views
0

向大家問好我試圖做一個觸發更新一個表中的信息,但該表具有信息,而這些信息來源於此程序存儲觸發以更新一行信息

create or replace procedure insertar (new_bod int, new_arti int, cant int) 
BEGIN 
    INSERT INTO bod_arti (bod_id, arti_id, cant) 
     VALUES (new_bod , new_arti, new_cant); 
END 

在此過程bod_id是來自BOD表的PK,arti_id是來自ARTI表的PK,當我試圖插入調用過程的值時,我有一個錯誤,這是因爲PK是相同的。 我該怎麼做才能在表格中插入不能添加的信息?我有這個觸發

create trigger myfirsttrigger BEFORE INSERT ON bod_arti 
FOR EACH ROW 
UPDATE bod_arti SET cant = cant + NEW.cant WHERE bod_id = NEW.bod_id AND arti_id = NEW.arti_id 

,當我用我已經插入我有這樣的錯誤

1442值再次調用程序 - 在存儲功能無法更新表「bod_arti」 /觸發器,因爲它是已經被調用這個存儲的函數/觸發器的語句使用。

我該怎麼辦? 謝謝!

+0

要更新什麼表? –

+1

使用觸發器插入時,您無法在其表格本身上更新表格 –

+0

您可以使用存儲過程在觸發器內進行更新。 –

回答

0

在oracle中PLSQL,看你怎麼可以這樣實現如下:

CREATE OR REPLACE PROCEDURE insertar (new_bod INT, 
             new_arti INT, 
             new_cant INT) 
AS 
BEGIN 
    INSERT INTO bod_arti (bod_id, arti_id, cant) 
     VALUES (new_bod, new_arti, new_cant); 

    COMMIT; 
END; 

觸發:

CREATE OR REPLACE TRIGGER myfirsttrigger 
    BEFORE INSERT 
    ON bod_arti 
    FOR EACH ROW 
BEGIN 

/*In place of writing a update you can try as below*/ 
-- UPDATE bod_arti 
--  SET cant = cant + :NEW.cant 
-- WHERE bod_id = :NEW.bod_id AND arti_id = :NEW.arti_id; 

    ---Create autonomous transaction 
    proc_upd(:old.bod_id ,:old.arti_id,:old.cant); 

END; 

自治事務

create or replace procedure proc_upd(num1 number,num2 number, num3 number) 
as 
PRAGMA AUTONOMOUS_TRANSACTION; 
begin 

    UPDATE bod_arti  
     SET cant = cant + num3  
    WHERE bod_id = num1 
    AND arti_id = num2; 

    commit; 

END; 

多次調用:

exec insertar(1,2,3); 
exec insertar(4,5,6); 

輸出:

SQL> select * from bod_arti; 

    BOD_ID ARTI_ID  CANT 
---------- ---------- ---------- 
     1   2   6 
     4   5   12