2014-07-26 4 views
0

고객이 60 일 이내에 지불하지 않은 경우 문제가 발생합니다. 트리거가 고객 테이블을 업데이트하고 여전히 오류 -20003을 발생시킵니다.트리거에서 트리거 응용 프로그램 오류 발생 및 테이블 업데이트

내가 알고있는 점은 raise 예외가 발생하면 업데이트 기능이 취소된다는 것입니다.

이 작업을 수행 할 수있는 방법이 있습니까?

CREATE OR REPLACE TRIGGER cut_supply 
BEFORE INSERT ON reading 
FOR EACH ROW 
DECLARE 
    cust_ID BILL.custID%TYPE; 
    sent_date BILL.sentDate%TYPE; 
    payment_date BILL.paymentdate%TYPE; 
    bad_Status CUSTOMER.badStatus%TYPE; 
    first_name CUSTOMER.firstName%TYPE; 
    last_name CUSTOMER.lastName%TYPE; 
    NRIC_No CUSTOMER.NRIC%TYPE; 
    pRate_ID CUSTOMER.pRateID%TYPE; 
    no_new_reading EXCEPTION; 
CURSOR cust_cursor IS 
     SELECT b.custID, b.sentDate, b.paymentDate, c.badStatus, c.firstName, c.lastName, c.NRIC, c.pRateID 
     FROM bill b, customer c, reading r 
     WHERE (sysdate - sentDate) > 20 
     AND paymentDate is null 
     AND b.custID = c.custID 
     AND r.readingID = b.readingID 
     FOR UPDATE OF c.badStatus; 
BEGIN 
    OPEN cust_cursor; 
    LOOP 
     FETCH cust_cursor INTO cust_ID, sent_date, payment_date, 
          bad_Status, first_name, last_name, NRIC_No, pRate_ID; 
     IF cust_cursor%NOTFOUND THEN 
      EXIT; 
     END IF; 
     IF cust_cursor%ROWCOUNT = 0 THEN 
      DBMS_OUTPUT.PUT_LINE('No customer found'); 
     ELSE 
      UPDATE customer 
      SET pRateID= 801, badStatus='Non Payment' 
      WHERE CURRENT OF cust_cursor; 
      RAISE no_new_reading; 
     END IF; 
    END LOOP; 
    CLOSE cust_cursor; 
    COMMIT; 
EXCEPTION 
    WHEN no_new_reading THEN 
    RAISE_APPLICATION_ERROR (-20003, 
     'Customer ' || first_name||''||last_Name || 
     ' water supply has been cut off'); 
    WHEN OTHERS THEN 
     DBMS_OUTPUT.PUT_LINE(SQLERRM); 
END; 
/
+1

ypu가 예외를 발생시키는 이유는 무엇입니까? 무슨 일이 일어날 것인가, 독서를 삽입하는 세션은'dbms_output' 텍스트를 보게됩니다 (* if * thay가 그것을 보도록 설정되어 있습니다, 당신은 모름), 그들은 예외도보고 ... 그 정보로 무엇을할까요? 어쨌든 새로운 독서가 일어 났을 때 늦게 지불해야하는 이유는 무엇입니까? 분명히 그런 종류의 수표는 정기적으로 예정된 일, 어쩌면 모든 계좌 또는 미납금 또는 일의 일일 스윕이어야합니까? –

+0

저는 Alex와 여기에 동의합니다 : 기술을 작동시키는 데 따르는 문제는 디자인/아키텍처의 혼란을 나타내는 증상입니다. 먼저 워크 플로우를 처리해야합니다. 그런 다음 워크 플로우를 올바르게 코딩 할 수 있습니다. – APC

+0

@AlexPoole 그래서 고객 테이블을 먼저 업데이트하는 저장 프로 시저를 만든 다음 트리거를 사용하여 새 프로 시저를 거부하는 프로 시저를 호출하면 괜찮습니까? – user3856751

답변

0

이, 다음과 같은 방식으로 해결 고객 테이블

create or replace procedure update_customer 
as 
pragma autonomous_transaction; 
begin 
update customer c set c.badStatus='Non Payment', c.pRateID=801 
where c.custID= 
(
    select distinct c.custID 
    FROM bill b, reading r 
     WHERE (sysdate - sentDate) > 20 
     AND paymentDate is null 
     AND b.custID = c.custID 
     AND r.readingID = b.readingID 
); 
commit; 
end; 
/

사용을 절차 자체를 호출하는 트리거를 업데이트하는 프로 시저를 만들 수 있습니다.

CREATE OR REPLACE TRIGGER cut_supply 
BEFORE INSERT ON reading 
FOR EACH ROW 
DECLARE 
    cust_ID BILL.custID%TYPE; 
    sent_date BILL.sentDate%TYPE; 
    payment_date BILL.paymentdate%TYPE; 
    bad_Status CUSTOMER.badStatus%TYPE; 
    first_name CUSTOMER.firstName%TYPE; 
    last_name CUSTOMER.lastName%TYPE; 
    NRIC_No CUSTOMER.NRIC%TYPE; 
    reject_new_reading_excep EXCEPTION; 
CURSOR cust_cursor IS 
    SELECT b.custID, b.sentDate, b.paymentDate, c.badStatus, c.firstName, c.lastName, c.NRIC 
     FROM bill b, customer c, reading r 
     WHERE (sysdate - sentDate) > 20 
     AND paymentDate is null 
     AND b.custID = c.custID 
     AND r.readingID = b.readingID; 
BEGIN 
    OPEN cust_cursor; 
    LOOP 
     FETCH cust_cursor INTO cust_ID, sent_date, payment_date, 
          bad_Status, first_name, last_name, NRIC_No; 

     IF cust_cursor%NOTFOUND THEN 
      EXIT; 
     END IF; 
     IF cust_cursor%ROWCOUNT = 0 THEN 
      DBMS_OUTPUT.PUT_LINE('No customer found'); 
     ELSE 
     update_customer; 
     RAISE reject_new_reading_excep; 
     END IF; 
    END LOOP; 
    CLOSE cust_cursor; 
    COMMIT; 
EXCEPTION 
    WHEN reject_new_reading_excep THEN 
    RAISE_APPLICATION_ERROR (-20003, 
     'Customer ' || first_name||''||last_Name || 
     ' water supply has been cut off'); 
    WHEN OTHERS THEN 
     DBMS_OUTPUT.PUT_LINE(SQLERRM); 
END; 
/
+0

감사합니다! 이것은 실제로 작동한다. – user3856751

관련 문제