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;
/
ypu가 예외를 발생시키는 이유는 무엇입니까? 무슨 일이 일어날 것인가, 독서를 삽입하는 세션은'dbms_output' 텍스트를 보게됩니다 (* if * thay가 그것을 보도록 설정되어 있습니다, 당신은 모름), 그들은 예외도보고 ... 그 정보로 무엇을할까요? 어쨌든 새로운 독서가 일어 났을 때 늦게 지불해야하는 이유는 무엇입니까? 분명히 그런 종류의 수표는 정기적으로 예정된 일, 어쩌면 모든 계좌 또는 미납금 또는 일의 일일 스윕이어야합니까? –
저는 Alex와 여기에 동의합니다 : 기술을 작동시키는 데 따르는 문제는 디자인/아키텍처의 혼란을 나타내는 증상입니다. 먼저 워크 플로우를 처리해야합니다. 그런 다음 워크 플로우를 올바르게 코딩 할 수 있습니다. – APC
@AlexPoole 그래서 고객 테이블을 먼저 업데이트하는 저장 프로 시저를 만든 다음 트리거를 사용하여 새 프로 시저를 거부하는 프로 시저를 호출하면 괜찮습니까? – user3856751