2016-09-16 9 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가 동일하기 때문에 발생합니다. 테이블에 캔트 (cant) 만 삽입하고 정보를 추가하려면 어떻게해야합니까? 나는이 트리거를

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'을 업데이트 할 수 없습니다를/트리거가 있기 때문에 이 저장 함수/트리거를 호출 한 문에 의해 이미 사용되었습니다.

어떻게해야합니까? 감사합니다!

오라클 PLSQL에서
+0

업데이트 할 것을 테이블? –

+1

트리거를 사용하여 삽입하는 동안 자체 테이블에서 테이블을 업데이트 할 수 없습니다. –

+0

저장 프로 시저를 사용하여 대신 트리거 내부를 업데이트 할 수 있습니다. –

답변

0

,이 아래에 달성 할 수있는 방법을 참조하십시오

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