2014-11-27 3 views
0

주문 총액을 알려주는 방아쇠를 만들려고합니다. 특정 주문에 대한 여러 행을 포함하는 ORNG_ORD_LINE 테이블이 있습니다. ORNG_ORDER 테이블에서 ORNG_ORD_LINE에 동일한 주문 번호를 가진 상품의 총 비용을 표시하는 열을 보유하고 싶습니다.트리거를 생성하여 다른 테이블의 열을 업데이트하십시오.

이 트리거의 목적은 Ord_Amount 열의 ORNG_ORDER 테이블을 ORNG_ORD_LINE 테이블에 저장된 모든 Ord_Num 개별 라인 항목의 계산 된 합계로 업데이트하는 것입니다. 따라서 Ord_Num 20002를 각각 $ 50의 세 줄짜리로 삽입하거나 업데이트하면 Ord_Amount 열은 $ 150을 읽어야합니다. 동일한 주문 번호의 행을 새 금액으로 업데이트하거나 삽입하거나 행을 삭제하면 Ord_Amount가 업데이트 된 총액을 반영하여 값을 수정해야합니다.

CREATE OR REPLACE TRIGGER ORNG_ORD_LINE_TOTAL_TRIGGER 
FOR UPDATE OR INSERT ON ORNG_ORD_LINE 
COMPOUND TRIGGER 
BEFORE EACH ROW IS 
BEGIN 
    :NEW.Ord_Line_Total := :NEW.Ord_Line_Price * :NEW.Ord_Line_Quantity; 
    END BEFORE EACH ROW; 
END ORNG_ORD_LINE_TOTAL_TRIGGER; 
/

이 나에게 INV_LINE 테이블에서 내 송장의 줄에 총을 제공 : 다음과 같이 주문 라인 당 총 금액을 얻기를위한

내 트리거입니다. 전체 주문에 대한 합계를 얻기 위해 동일한 송장 번호가 할당 된 각 개별 라인을 추가하는 트리거를 만들고이 번호를 ORNG_ORDER 테이블의 Ord_Amount 열을 업데이트하도록합니다. 또한 ORNG_ORD_LINE에서 행을 삭제할 경우 트리거가 변경 사항을 반영하는 ORNG_ORDER의 총계를 업데이트하는지 확인하고 싶습니다. 그래서,

CREATE OR REPLACE TRIGGER ORNG_ORDER_TOTAL_TRIGGER 
    AFTER INSERT OR UPDATE ON ORNG_ORD_LINE 
    DECLARE 
    V_ORD_LINE_TOTAL DEC := 0 
    V_ORD_NUM INTEGER := 0 

    BEGIN 
    --1) Get the Order Number 

    SELECT :NEW.Ord_Num INTO V_ORD_NUM 
    FROM ORNG_ORDER 
    WHERE ORNG_ORDER.Ord_Num = :NEW.Ord_Num; 

    --2) Get the sum of all lines with the matching order number and set the 
variable with that value 

    V_ORD_LINE_TOTAL := 

    SELECT SUM(Ord_Line_Total) 
    FROM ORNG_ORD_LINE 
    WHERE Ord_Num = :NEW.Ord_Num; 

    --3) Write updated total to the ORNG_ORDER tables 

    UPDATE ORNG_ORDER 
    SET Ord_Amount = V_ORD_LINE_TOTAL 
    WHERE Ord_Num = :NEW.Ord_Num; 

    END ORNG_ORDER_TOTAL_TRIGGER; 
    /

나는 여전히이의 묘리를 터득하기 위해 노력하고있어 : 이것은 내가 지금까지 가지고있는,하지만 난 구문과 몇 가지 문제가 있어요, 나는 누군가가 나에게 그것을 해결하는 데 도움 수있는 기대했다 어떤 도움, 그리고 내가 뭘 잘못하고 있는지에 대한 설명은 크게 감사하겠습니다.

+0

누구있어? 부디? – jjmil03

답변

0

첫 번째 단계는 함께 수량과 가격을 곱함으로써 내부적으로 총 금액을 계산 하였다 : 그 행에 영향을주기 때문에

CREATE OR REPLACE TRIGGER ORNG_INV_LINE_MULT 
BEFORE INSERT OR UPDATE ON ORNG_INV_LINE 
FOR EACH ROW 
BEGIN 
:NEW.Inv_Line_Total := :NEW.Inv_Line_Price * :NEW.Inv_Line_Quantity; 
END ORNG_INV_LINE_MULT; 
/

이것은, 로우 레벨의 트리거로 할 수있다.

문장 레벨 트리거가 될하는 데 필요한 두 번째 문을, 그렇지 않으면 나는 돌연변이 오류 (이유에 아직 확실)

create or replace TRIGGER ORNG_INV_L_TTL_TRIG 
AFTER INSERT OR UPDATE OR DELETE ON ORNG_INV_LINE 
BEGIN 
UPDATE ORNG_INVOICE SET Inv_Amount = (SELECT SUM(Inv_Line_Total) 
FROM ORNG_INV_LINE 
WHERE INV_Num = ORNG_INVOICE.INV_Num); 
END ORNG_INV_L_TTL_TRIG; 
/
관련 문제