2017-04-18 1 views
0

나는 COMMANDE 테이블과 REGROUPE 테이블이 있습니다. 내가 하나 개 이상의 항목을 포함 할 수있는 명령의 세금 총 가격을 업데이트 할 것을 founction를 사용하여 트리거를 만들려고ORACLE SQL 트리거 및 SUM()

CREATE OR REPLACE PROCEDURE multiplicateur(a NUMBER, taxes NUMBER, c OUT NUMBER) 
IS 
BEGIN 
    c := a * taxes ; 
END multiplicateur; 
/

: 그 기능을 가지고있다. 나는 이것을 시도했지만 일하고 싶지 않다 :

create or replace TRIGGER MAJ_PRIX_COMMANDE 
AFTER INSERT OR UPDATE OR DELETE ON REGROUPE 
FOR EACH ROW 
DECLARE 
resultat NUMBER; 
BEGIN 
UPDATE COMMANDE 
SET COMMANDE.prixTotal = multiplicateur((CAST((SELECT SUM(prixRegroupe)FROM REGROUPE WHERE REGROUPE.numCommande = :NEW.numCommande)AS NUMBER)),1.15,resultat) 

WHERE COMMANDE.numCommande = :NEW.numCommande; 
END; 

나를 도울 수있는 누군가?

+1

쿼리에서 값을 사용하려면 함수를 만들어야합니다. –

+0

당신은 이미 가지고있는 것 이외의 다른 것을 의미합니까? 내가 이해할 수 있을지 모르겠다. –

+2

@XavierSavage - 현재 프로 시저가 있는데 함수가 아니다. 프로 시저를 먼저 호출 한 다음 업데이트에서'resultat'를 사용할 수 있습니다. 그래도 간단한 계산을하기 위해 sepearate 절차/기능을 갖는 것이 가치가 있습니까? 그리고 방아쇠가 여기에 적합한 메커니즘이라고 확신합니까? –

답변

0

어때? 나는 이걸 내 아이폰에서 보냈다. 이 코드는 테스트되지 않았습니다.

create or replace TRIGGER MAJ_PRIX_COMMANDE 
AFTER INSERT OR UPDATE OR DELETE ON REGROUPE 
FOR EACH ROW 
DECLARE 
resultat NUMBER; 
l_groupe NUMBER; --will store sum based on numCommande 
BEGIN 
--retrieve sum of prixRegroupe 
SELECT SUM(r.prixRegroupe) 
    INTO l_groupe 
    FROM regroupe r 
    WHERE r.numCommande = :NEW.numCommande; 

    --call procedure and pass the sum of priRegroupe 
    multiplicateur(l_groupe, 1.15, resultat); 

    --use precedures out argument to update commande 
UPDATE COMMANDE c 
    SET c.prixTotal = resultat 
    WHERE c.numCommande = :NEW.numCommande; 
END; 

이 코드는 작동하지 않습니다. 돌연변이 트리거 오류가 발생합니다. 트리거 내에서 트리거가 실행을 완료 할 때까지 트리거가 기반으로하는 동일한 테이블을 쿼리하거나 수정할 수 없습니다.

ORA-04091 : 테이블 이름은 돌연변이되고, 트리거/함수는

귀하의 현재 문제 트리거가 동일한 테이블을 갱신/삽입을 시도하는 동안 regroupe 테이블을 조회하고 있다는 것입니다 표시되지 않을 수 있습니다. 이것은 성취 될 수 없다.

prixRegroup 열의 합계를 다른 방법으로 얻는 방법을 찾아야합니다. 내가 내일 응답 할 것이 무엇이든 생각하면 늦었습니다.

+0

고마워! 그것은 작동하지만 REGROUPE에 뭔가를 삽입하려고하면 다음과 같이 나타납니다. "* 원인 : 트리거 (또는이 문에서 에서 참조되는 사용자 정의 plsql 함수)가 테이블을 보거나 수정하려고 시도했습니다. * 조치 : 트리거 (또는 함수)를 다시 작성하여 해당 테이블을 읽지 않도록하십시오. " 이유는 모르겠지만 Commande 테이블 만 업데이트합니다. –

+0

@XavierSavage 전체 오류 메시지를 게시 할 수 있습니까? 또한 삽입 할 때만이 오류가 발생한다고 말하는 것입니까? 방아쇠가 업데이 트와 삭제와 잘 작동합니까? – hisnameismyname2

+0

내 질문에 새로운 대답으로 아래에 쓴 –