-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathp06.sql
70 lines (60 loc) · 2.05 KB
/
p06.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
CREATE OR REPLACE TRIGGER OfferConstraint
BEFORE INSERT OR UPDATE OF OfferAmount
ON Offers
FOR EACH ROW
DECLARE
vApprovalAmount PreApprovals.Amount%Type;
BEGIN
SELECT amount
INTO vApprovalAmount
FROM ApprovalDetails
WHERE ApprovalID = :NEW.ApprovalNo;
IF :NEW.OfferAmount > vApprovalAmount THEN
raise_application_error(-20002, 'Offer amount can not be more than approval amount');
END IF;
EXCEPTION
WHEN Too_Many_Rows THEN
DBMS_OUTPUT.PUT_LINE('Too many rows found ' || sqlerrm);
WHEN No_Data_Found THEN
DBMS_OUTPUT.PUT_LINE('No data was found ' || sqlerrm);
WHEN Others THEN
DBMS_OUTPUT.PUT_LINE('Unknown error in trigger' || sqlerrm);
END;
/
CREATE OR REPLACE PROCEDURE CreateOffer(vListingID Listings.ListingID%Type,
vApprovalID ApprovalDetails.ApprovalID%Type,
vOfferAmount Offers.OfferAmount%Type,
vExpDate Offers.ExpireDate%Type) AS
vCustID Customers.CustID%TYPE;
vOfferID NUMBER;
CURSOR cCustomers IS
SELECT CustID FROM Preapprovals
WHERE PreapprovalID = vApprovalID;
BEGIN
vOfferID := OFFER_SEQ.nextval;
INSERT INTO Offers(OfferID, ListingID, OfferDate, ExpireDate, OfferAmount, ApprovalNo)
VALUES (vOfferID, vListingID, SYSDATE, vExpDate, vOfferAmount, vApprovalID);
OPEN cCustomers;
LOOP
FETCH cCustomers INTO vCustID;
EXIT WHEN cCustomers%NOTFOUND;
INSERT INTO OfferParticipants(OfferID, CustID) VALUES(vOfferID, vCustID);
END LOOP;
CLOSE cCustomers;
COMMIT;
EXCEPTION
WHEN Too_Many_Rows THEN
DBMS_OUTPUT.PUT_LINE('Too many rows were selected ' || sqlerrm);
ROLLBACK;
WHEN No_Data_Found THEN
DBMS_OUTPUT.PUT_LINE('No data was found ' || sqlerrm);
ROLLBACK;
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Unknown error ' || sqlerrm);
ROLLBACK;
END;
/
BEGIN
CreateOffer(10, 7, 350000, '19-Jul-2021');
END;
/