1CREATE OR REPLACE PROCEDURE apply_late_fees (p_run_date IN DATE) IS
2 CURSOR c_overdue IS
3 SELECT inv.invoice_id, inv.balance, c.segment
4 FROM invoices inv
5 JOIN customers c ON c.customer_id = inv.customer_id
6 WHERE inv.due_date < p_run_date - 15
7 AND inv.status = 'OPEN';
8 v_fee invoices.balance%TYPE;
9BEGIN
10 FOR r IN c_overdue LOOP
11 IF r.segment = 'GOV' THEN
12 v_fee := 0;
13 ELSE
14 v_fee := GREATEST(ROUND(r.balance * 0.015, 2), 25);
15 END IF;
16 UPDATE invoices
17 SET balance = balance + v_fee,
18 late_fee_count = late_fee_count + 1
19 WHERE invoice_id = r.invoice_id;
20 END LOOP;
21 COMMIT;
22EXCEPTION
23 WHEN OTHERS THEN NULL;
24END apply_late_fees;