├── EER_Diagram.jpg ├── Project-Report.pdf ├── README.md ├── db_schema.sql ├── pl_sql_procedures.sql └── pl_sql_triggers.sql /EER_Diagram.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruchi15/e-commerce-website-database-design/b356a9ca34f5c66c38fa09b9d62c12d367c57df3/EER_Diagram.jpg -------------------------------------------------------------------------------- /Project-Report.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruchi15/e-commerce-website-database-design/b356a9ca34f5c66c38fa09b9d62c12d367c57df3/Project-Report.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # e-commerce-website-database-design 2 | This repository contains EER design, relational model schema and SQL and PL-SQL code for an e-commerce website. 3 | -------------------------------------------------------------------------------- /db_schema.sql: -------------------------------------------------------------------------------- 1 | --USE amazon ; 2 | -- User Schema 3 | 4 | Drop TABLE User1; 5 | Drop TABLE Buyer; 6 | Drop TABLE Seller; 7 | Drop TABLE Address; 8 | 9 | Drop TABLE Product; 10 | Drop TABLE Shopping_Cart; 11 | Drop TABLE Wishlist; 12 | Drop TABLE Reviews; 13 | Drop TABLE Discount; 14 | Drop TABLE Offer; 15 | 16 | Drop TABLE Wishlist_Product; 17 | Drop TABLE Order_Product; 18 | DROP TABLE Cart_Product; 19 | 20 | Drop TABLE Orders; 21 | Drop TABLE Invoice; 22 | Drop TABLE Shipper; 23 | Drop TABLE Payment; 24 | Drop TABLE Payment_Card; 25 | Drop TABLE Payment_Giftcard; 26 | 27 | 28 | CREATE TABLE User1( 29 | UserID VARCHAR(8) NOT NULL, 30 | USER_TYPE VARCHAR(1) NOT NULL, 31 | DateCreated DATE NOT NULL, 32 | PRIMARY KEY (UserID) 33 | ); 34 | -- Users can be buyers and sellers but will have different accounts. 35 | 36 | CREATE TABLE Buyer( 37 | BuyerID VARCHAR(8) NOT NULL, 38 | UserID VARCHAR(8) NOT NULL, 39 | Membership VARCHAR(1) NOT NULL, 40 | BuyerFirstName VARCHAR(50) NOT NULL, 41 | BuyerLastName VARCHAR(50) NULL, 42 | PhoneNumber VARCHAR(15) DEFAULT 'xxx-xxx-xxxx' NOT NULL, 43 | Email VARCHAR(50) NOT NULL, 44 | PRIMARY KEY (UserID) 45 | ); 46 | 47 | CREATE TABLE Seller ( 48 | SellerID VARCHAR(8) NOT NULL, 49 | UserID VARCHAR(8) NOT NULL, 50 | CompanyName VARCHAR(50) NOT NULL, 51 | SellerFirstName VARCHAR(50) NOT NULL, 52 | SellerLastName VARCHAR(50) NOT NULL, 53 | PhoneNumber VARCHAR(15) DEFAULT 'xxx-xxx-xxxx' NOT NULL, 54 | Email VARCHAR(50) NOT NULL, 55 | Logo BLOB NULL, 56 | PRIMARY KEY (UserID)); 57 | 58 | --Can add multiple addresses so using AddressID as a PrimaryKey 59 | CREATE TABLE Address ( 60 | AddressID VARCHAR(8) NOT NULL, 61 | UserID VARCHAR(8) NOT NULL, 62 | Address_Type VARCHAR(20) NOT NULL, 63 | AddressLine1 VARCHAR(50) NULL, 64 | City VARCHAR(50) NULL, 65 | Province VARCHAR(50) NULL, 66 | Country VARCHAR(50) NULL, 67 | PostalCode VARCHAR(10) NULL, 68 | PRIMARY KEY (AddressID)); 69 | 70 | --CREATE INDEX UserID_idx ON Sellers (UserID ASC); 71 | -- Product Schema 72 | 73 | CREATE TABLE Product ( 74 | ProductID VARCHAR(8) NOT NULL, 75 | Department VARCHAR(50) NOT NULL, 76 | ProductName VARCHAR(50) NOT NULL, 77 | UnitPrice DECIMAL NOT NULL, 78 | ProductDescription VARCHAR(255) NULL, 79 | UnitsInStock INT NULL, 80 | UnitsInOrder INT NULL, 81 | ItemPicture BLOB NULL, 82 | PRIMARY KEY (ProductID)); 83 | 84 | 85 | CREATE TABLE Shopping_Cart ( 86 | ShoppingCartID VARCHAR(8) NOT NULL, 87 | UserID VARCHAR(8) NOT NULL, 88 | Quantity VARCHAR(8), 89 | PRIMARY KEY (ShoppingCartID)); 90 | 91 | --CREATE INDEX ProductID_idx ON Shopping_Cart (ProductID ASC); 92 | 93 | 94 | CREATE TABLE Wishlist ( 95 | WishlistID VARCHAR(8) NOT NULL, 96 | UserID VARCHAR(8) NOT NULL, 97 | PRIMARY KEY (WishlistID)); 98 | 99 | --CREATE INDEX ProductID_idx ON Wishlist (ProductID ASC); 100 | 101 | CREATE TABLE Reviews ( 102 | ReviewID VARCHAR(8) NOT NULL, 103 | ProductID VARCHAR(8) NOT NULL, 104 | UserID VARCHAR(8) NOT NULL, 105 | CustomerReview VARCHAR(100) NULL, 106 | Rating VARCHAR(1) NOT NULL, 107 | PRIMARY KEY (ReviewID)); 108 | 109 | CREATE TABLE Offer ( 110 | OfferID VARCHAR(8) NOT NULL, 111 | ProductID VARCHAR(8) NULL, 112 | OfferAmount VARCHAR(8) NULL, 113 | PRIMARY KEY (OfferID)); 114 | 115 | --CREATE INDEX fk_Product_has_Discount_Discount1_idx ON Offer (DiscountID ASC); 116 | -- 117 | --CREATE INDEX fk_Product_has_Discount_Product1_idx ON Offer (ProductID ASC); 118 | 119 | --Relationsgip between Order and Product 120 | 121 | -- Payments 122 | CREATE TABLE Orders ( 123 | OrderID VARCHAR(8) NOT NULL, 124 | UserID VARCHAR(8) NOT NULL, 125 | ShipperID VARCHAR(8) NOT NULL, 126 | OrderDate DATE NOT NULL, 127 | RequiredDate DATE NOT NULL, 128 | Tax DECIMAL NOT NULL, 129 | TransactionStatus VARCHAR(50) NOT NULL, 130 | PaymentDate DATE NOT NULL, 131 | ItemQuantity INT NULL, 132 | Price DECIMAL NOT NULL, 133 | PRIMARY KEY (OrderID)); 134 | 135 | CREATE TABLE Order_Product ( 136 | OrderID VARCHAR(8) NOT NULL, 137 | ProductID VARCHAR(8) NOT NULL, 138 | PRIMARY KEY (OrderID,ProductID)); 139 | 140 | 141 | CREATE TABLE Cart_Product ( 142 | ShoppingCartID VARCHAR(8) NOT NULL, 143 | ProductID VARCHAR(8) NOT NULL, 144 | PRIMARY KEY (ShoppingCartID,ProductID)); 145 | 146 | CREATE TABLE WishList_Product ( 147 | WishlistID VARCHAR(8) NOT NULL, 148 | ProductID VARCHAR(8) NOT NULL, 149 | PRIMARY KEY (WishlistID,ProductID)); 150 | 151 | CREATE TABLE Invoice ( 152 | OrderID VARCHAR(8) NOT NULL, 153 | InvoiceID VARCHAR(8) NOT NULL, 154 | Invoice_Type VARCHAR(4) NOT NULL, 155 | InvoiceAmount DECIMAL NOT NULL, 156 | PRIMARY KEY (InvoiceID)); 157 | 158 | 159 | -- 160 | --CREATE INDEX UserID_idx ON Orders (UserID ASC); 161 | -- 162 | --CREATE INDEX ShipperID_idx ON Orders (ShipperID ASC); 163 | 164 | 165 | 166 | CREATE TABLE Shipper ( 167 | ShipperID VARCHAR(8) NOT NULL, 168 | ShipperCompanyName VARCHAR(50) NULL, 169 | ContactName VARCHAR(50) NULL, 170 | Phone VARCHAR(15) NULL, 171 | PRIMARY KEY (ShipperID)); 172 | 173 | --CREATE UNIQUE INDEX UNIQUE_ShipperID ON Shipper (ShipperID ASC); 174 | 175 | 176 | 177 | -- Payments . Amazon allows you to pay using multiple options only when one of them is giftcard option. 178 | 179 | 180 | CREATE TABLE Payment ( 181 | PaymentID VARCHAR(8) NOT NULL, 182 | OrderID VARCHAR(8) NOT NULL, 183 | Payment_Type VARCHAR(1) NOT NULL, 184 | PRIMARY KEY (PaymentID)); 185 | 186 | --CREATE INDEX OrderID_idx ON Payment (OrderID ASC); 187 | 188 | CREATE TABLE Payment_Card ( 189 | CardID VARCHAR(8) NOT NULL, 190 | PaymentID VARCHAR(8) NOT NULL, 191 | CardNumber VARCHAR(20) NOT NULL, 192 | CardExpMonth INT NOT NULL, 193 | CardExpYear INT NOT NULL, 194 | PRIMARY KEY (PaymentID)); 195 | 196 | --CREATE INDEX PaymentID_idx ON Payment_CreditCard (PaymentID ASC); 197 | 198 | --CREATE INDEX fk_Orders_has_Product_Product1_idx ON Orders_has_Product (Product_ProductID ASC); 199 | -- 200 | --CREATE INDEX fk_Orders_has_Product_Orders1_idx ON Orders_has_Product (Orders_OrderID ASC); 201 | 202 | 203 | CREATE TABLE Payment_Giftcard ( 204 | GiftcardID VARCHAR(8) NOT NULL, 205 | PaymentID VARCHAR(8) NOT NULL, 206 | GiftCardAmount VARCHAR(8) NOT NULL, 207 | GiftCardNumber VARCHAR(16) NOT NULL, 208 | GiftcardExpMonth VARCHAR(2) NOT NULL, 209 | GiftcardExpYear VARCHAR(4) NOT NULL, 210 | PRIMARY KEY (PaymentID)); 211 | 212 | --CREATE INDEX PaymentID_idx ON Payment_Giftcard (PaymentID ASC); 213 | 214 | --USE amazon ; 215 | -- 216 | --CREATE TABLE IF NOT EXISTS view1 (id INT); 217 | -- 218 | --DROP TABLE view1; 219 | --USE amazon; 220 | 221 | -- Orders and Payments One to One, Membership and Buyers has one to one relationship. 222 | -- One Department Has Many Products, One User Can have many orders. One User can have many addresses. 223 | -- One product can be in many wishlist and One wishlist can contain many products.Many order has many products. Many to many Shopping Cart and Product 224 | 225 | ALTER TABLE Buyer ADD CONSTRAINT fk_uid_buyer FOREIGN KEY(UserID) REFERENCES User1(UserID) on delete cascade; 226 | ALTER TABLE Seller ADD CONSTRAINT fk_uid_seller FOREIGN KEY(UserID) REFERENCES User1(UserID) on delete cascade; 227 | ALTER TABLE Address ADD CONSTRAINT fk_uid_user_add FOREIGN KEY(UserID) REFERENCES User1(UserID) on delete cascade; 228 | ALTER TABLE Shopping_Cart ADD CONSTRAINT fk_cart_User FOREIGN KEY(UserID) REFERENCES User1(UserID) on delete cascade; 229 | ALTER TABLE WishList ADD CONSTRAINT fk_wishlist_User FOREIGN KEY(UserID) REFERENCES Users1(UserID) on delete cascade; 230 | ALTER TABLE Reviews ADD CONSTRAINT fk_productId FOREIGN KEY(UserID) REFERENCES Users1(UserID) on delete cascade; 231 | ALTER TABLE Orders ADD CONSTRAINT fk_order_UserdID FOREIGN KEY(UserID) REFERENCES User1(UserdID) on delete cascade; 232 | 233 | 234 | ALTER TABLE Cart_Product ADD CONSTRAINT fk_cartProduct FOREIGN KEY(ShoppingCartID) REFERENCES Shopping_Cart(ShoppingCartID) on delete cascade; 235 | 236 | ALTER TABLE WishList_Product ADD CONSTRAINT fk_wishlistProduct FOREIGN KEY(WishlistID) REFERENCES Wishlist(WishlistID) on delete cascade; 237 | 238 | ALTER TABLE Reviews ADD CONSTRAINT fk_productId FOREIGN KEY(ProductID) REFERENCES Product(ProductID) on delete cascade; 239 | ALTER TABLE Shopping_Cart ADD CONSTRAINT fk_cartProduct1 FOREIGN KEY(ProductID) REFERENCES Product(ProductID) on delete cascade; 240 | ALTER TABLE Order_Product ADD CONSTRAINT fk_Order_Product FOREIGN KEY(ProductID) REFERENCES Product(ProductID) on delete cascade; 241 | ALTER TABLE Offer ADD CONSTRAINT fk_OfferProductID FOREIGN KEY(ProductID) REFERENCES Product(ProductID) on delete cascade; 242 | ALTER TABLE Cart_Product ADD CONSTRAINT fk_cartProduct1 FOREIGN KEY(ProductID) REFERENCES Product(ShoppingCartID) on delete cascade; 243 | 244 | ALTER TABLE Order_Product ADD CONSTRAINT fk_Order_Product1 FOREIGN KEY(OrderID) REFERENCES Orders(OrderID) on delete cascade; 245 | ALTER TABLE Invoice ADD CONSTRAINT fk_invoice_order FOREIGN KEY(OrderID) REFERENCES Orders(OrderID) on delete cascade; 246 | ALTER TABLE Payment ADD CONSTRAINT fk_invoice_order FOREIGN KEY(OrderID) REFERENCES Orders(OrderID) on delete cascade; 247 | 248 | ALTER TABLE Orders ADD CONSTRAINT fk_order_ship FOREIGN KEY(ShipperID) REFERENCES Shipper(ShipperID) on delete cascade; 249 | 250 | ALTER TABLE Payment_Card ADD CONSTRAINT fk_card_payment FOREIGN KEY(PaymentID) REFERENCES Payment(PaymentID) on delete cascade; 251 | ALTER TABLE Payment_Giftcard ADD CONSTRAINT fk_giftcard_payment FOREIGN KEY(PaymentID) REFERENCES Payment(PaymentID) on delete cascade; 252 | -------------------------------------------------------------------------------- /pl_sql_procedures.sql: -------------------------------------------------------------------------------- 1 | -- Stored Procedure for registering BUYER 2 | set serveroutput on; 3 | 4 | CREATE OR REPLACE PROCEDURE REGISTERBUYER ( 5 | u_userid user1.userid%TYPE, 6 | u_userType user1.user_type%TYPE, 7 | u_dateCreated user1.datecreated%TYPE, 8 | b_id BUYER.BUYERID%TYPE, 9 | b_membership buyer.membership%TYPE, 10 | b_buyerFirstName buyer.buyerfirstname%TYPE, 11 | b_buyerLastName buyer.buyerlastname%TYPE, 12 | b_phoneNumber buyer.phonenumber%TYPE, 13 | b_email buyer.email%TYPE) 14 | IS 15 | BEGIN 16 | INSERT INTO USER1 (USERID, USER_TYPE, DATECREATED) 17 | VALUES (u_userid, u_userType, u_dateCreated); 18 | 19 | INSERT INTO BUYER (BUYERID, USERID, MEMBERSHIP, BUYERFIRSTNAME, BUYERLASTNAME, PHONENUMBER, EMAIL) 20 | VALUES (b_id, u_userid, b_membership, b_buyerFirstName, b_buyerLastName, b_phoneNumber, b_email); 21 | 22 | COMMIT; 23 | END; 24 | / 25 | 26 | CREATE OR REPLACE PROCEDURE REGISTERSELLER ( 27 | u_userid user1.userid%TYPE, 28 | u_userType user1.user_type%TYPE, 29 | u_dateCreated user1.datecreated%TYPE, 30 | s_id seller.sellerid%TYPE, 31 | s_companyName seller.companyname%TYPE, 32 | s_sellerFirstName seller.sellerfirstname%TYPE, 33 | s_sellerLastName seller.sellerlastname%TYPE, 34 | s_phoneNumber seller.phonenumber%TYPE, 35 | s_email seller.email%TYPE, 36 | s_logo seller.logo%TYPE) 37 | IS 38 | BEGIN 39 | INSERT INTO USER1 (USERID, USER_TYPE, DATECREATED) 40 | VALUES (u_userid, u_userType, u_dateCreated); 41 | 42 | INSERT INTO SELLER (SELLERID, USERID, companyname, sellerfirstname, sellerlastname, phonenumber, email, logo) 43 | VALUES (s_id, u_userid, s_companyName, s_sellerFirstName, s_sellerLastName, s_phoneNumber, s_email, s_logo); 44 | 45 | COMMIT; 46 | END; 47 | / 48 | BEGIN 49 | REGISTERBUYER(1, 'b', SYSDATE, 12345678, 'Y', 'JANE', 'DOE', '123-456-7890', 'jdoe@gmail.com'); 50 | END; 51 | BEGIN 52 | REGISTERSELLER(456, 'S', SYSDATE-1, 2, 'AMAZON', 'ANANT', 'PRAKASH', '469-350-1307', 'ruchi@gmail.com', NULL); 53 | END; 54 | 55 | 56 | select * from user1; 57 | SELECT * FROM BUYER; 58 | select * from SELLER; 59 | 60 | 61 | 62 | -- Stored Procedure for registering SELLER 63 | 64 | 65 | 66 | 67 | -- Stored Procedure for storing an order 68 | 69 | CREATE OR REPLACE PROCEDURE StoreProduct ( 70 | p_productID product.productid%TYPE, 71 | p_department product.department%TYPE, 72 | p_productName product.productname%TYPE, 73 | p_unitPrice product.unitprice%TYPE, 74 | p_productDesc product.productdescription%TYPE, 75 | p_unitsInStock product.unitsinstock%TYPE, 76 | p_unitsInOrder product.unitsinorder%TYPE, 77 | p_itemPicture product.itempicture%TYPE) 78 | IS 79 | BEGIN 80 | 81 | INSERT INTO PRODUCT(PRODUCTID, DEPARTMENT, PRODUCTNAME, UNITPRICE, PRODUCTDESCRIPTION, UNITSINSTOCK, UNITSINORDER, ITEMPICTURE) 82 | VALUES (p_productID, p_department, p_productName, p_unitPrice, p_productDesc, p_unitsInStock, p_unitsInOrder, p_itemPicture); 83 | 84 | COMMIT; 85 | END; 86 | / 87 | 88 | BEGIN 89 | StoreProduct(1, 'Electronics', 'Tablet', 5000, 'tablet', 100, 0, NULL); 90 | StoreProduct(2, 'Sports', 'Football', 100, 'Signed by Messi', 100, 0, NULL); 91 | StoreProduct(3, 'Kitchen', 'SilverWare', 50, 'kitchen ware', 100, 0, NULL); 92 | StoreProduct(4, 'Education', 'DB Design Book', 100, 'Study Well', 100, 0, NULL); 93 | END; 94 | / 95 | 96 | CREATE OR REPLACE PROCEDURE ADD_ADDRESS ( 97 | u_AddressID Address.AddressID%TYPE, 98 | u_UserID Address.UserID%TYPE, 99 | u_Address_Type Address.Address_Type%TYPE, 100 | u_AddressLine1 Address.AddressLine1%Type, 101 | u_City Address.City%TYPE, 102 | u_Province Address.Province%TYPE, 103 | u_Country Address.Country%TYPE, 104 | u_PostalCode Address.PostalCode%TYPE 105 | ) 106 | IS 107 | BEGIN 108 | INSERT INTO Address (AddressID ,UserID ,Address_Type ,AddressLine1 ,City ,Province ,Country ,PostalCode) 109 | VALUES (u_AddressID, u_UserID, u_Address_Type, u_AddressLine1, u_City, u_Province, u_Country, u_PostalCode); 110 | COMMIT; 111 | END; 112 | / 113 | 114 | BEGIN 115 | ADD_ADDRESS('H1', 1, 'Home', '7815 McCallum Blvd.', 'Dallas', 'Texas', 'US', 75252); 116 | ADD_ADDRESS('W1', 1, 'Work', '2.104, ECSS, UT Dallas', 'Dallas', 'Texas', 'US', 75252); 117 | END; 118 | 119 | CREATE OR REPLACE PROCEDURE Insert_into_Cart ( 120 | s_ShoppingCartID Cart_Product.ShoppingCartID%TYPE , 121 | s_ProductID Cart_Product.ProductID%TYPE, 122 | s_USerID User1.UserID%TYPE 123 | ) 124 | IS 125 | BEGIN 126 | DECLARE 127 | counter INT; 128 | pcount VARCHAR(8); 129 | BEGIN 130 | Select count(*) into pcount from Product where ProductID=s_ProductID; 131 | 132 | if pcount>0 133 | then 134 | Select count(*) into counter from Cart_Product where ShoppingCartID = s_ShoppingCartID; 135 | INSERT INTO Cart_Product(ShoppingCartID,ProductID) 136 | VALUES (s_ShoppingCartID, s_ProductID); 137 | if counter = 0 138 | THEN 139 | INSERT into Shopping_Cart(ShoppingCartID ,UserID ,Quantity) 140 | VALUES (s_ShoppingCartID,s_USerID,counter+1); 141 | ELSE 142 | UPDATE Shopping_Cart SET Quantity = counter+1 where ShoppingCartID = s_ShoppingCartID; 143 | END IF; 144 | COMMIT; 145 | else 146 | Raise_Application_Error(-20005, 'No such Product available'); 147 | END IF; 148 | END; 149 | END; 150 | / 151 | 152 | BEGIN 153 | Insert_into_Cart('SH1', 1, 1); 154 | Insert_into_Cart('SH1', 2, 1); 155 | END; 156 | 157 | CREATE OR REPLACE PROCEDURE Quantity_IN_ShoppingCart ( 158 | s_ShoppingCartID Cart_Product.ShoppingCartID%TYPE , 159 | qty out INT 160 | ) 161 | IS 162 | BEGIN 163 | Declare counter INT; 164 | BEGIN 165 | Select count(*) into counter from Cart_Product where ShoppingCartID = s_ShoppingCartID; 166 | if counter = 0 167 | THEN 168 | Raise_Application_Error(-20000, 'No item in Shopping Cart'); 169 | ELSE 170 | qty:=counter; 171 | END IF; 172 | END; 173 | END; 174 | / 175 | 176 | set serveroutput on; 177 | DECLARE 178 | qty INT; 179 | BEGIN 180 | Quantity_IN_ShoppingCart('SH1',qty); 181 | dbms_output.put_line('Result is '||qty); 182 | END; 183 | 184 | CREATE OR REPLACE PROCEDURE Products_IN_ShoppingCart ( 185 | s_ShoppingCartID IN Cart_Product.ShoppingCartID%TYPE , 186 | productList out SYS_REFCURSOR 187 | ) 188 | IS 189 | BEGIN 190 | 191 | OPEN productList FOR 192 | Select ProductID from Cart_Product where ShoppingCartID = s_ShoppingCartID; 193 | 194 | END; 195 | / 196 | 197 | set serveroutput on; 198 | DECLARE 199 | cur SYS_REFCURSOR; 200 | product VARCHAR(8); 201 | BEGIN 202 | Products_IN_ShoppingCart('SH1',cur); 203 | LOOP 204 | FETCH cur into product; 205 | EXIT WHEN cur%NOTFOUND; 206 | dbms_output.put_line('Result is '||product); 207 | END LOOP; 208 | CLOSE cur; 209 | END; 210 | 211 | 212 | 213 | 214 | 215 | CREATE OR REPLACE PROCEDURE PriceEngine ( 216 | s_ShoppingCartID Cart_Product.ShoppingCartID%TYPE , 217 | price out DECIMAL 218 | ) 219 | IS 220 | BEGIN 221 | DECLARE 222 | prodList SYS_REFCURSOR; 223 | pr DECIMAL; 224 | product VARCHAR(8); 225 | p DECIMAL; 226 | BEGIN 227 | Products_IN_ShoppingCart(s_ShoppingCartID, prodList); 228 | pr:=0; 229 | LOOP 230 | FETCH prodList into product; 231 | EXIT WHEN prodList%NOTFOUND; 232 | p:=0; 233 | Select UnitPrice into p from Product where ProductID=product; 234 | pr:= pr+p; 235 | dbms_output.put_line(pr || ' ' || p); 236 | END LOOP; 237 | CLOSE prodList; 238 | price:=pr; 239 | END; 240 | END; 241 | / 242 | 243 | 244 | set serveroutput on; 245 | DECLARE 246 | price DECIMAL; 247 | BEGIN 248 | PriceEngine('SH1',price); 249 | dbms_output.put_line('Order price is '|| price); 250 | END; 251 | 252 | CREATE OR REPLACE Procedure Insert_Order_Product( 253 | OrID Orders.OrderID%TYPE, 254 | ListOfProducts SYS_REFCURSOR) 255 | IS 256 | BEGIN 257 | DECLARE 258 | product VARCHAR(8); 259 | BEGIN 260 | LOOP 261 | FETCH ListOfProducts into product; 262 | EXIT WHEN ListOfProducts%NOTFOUND; 263 | 264 | Insert into order_product(OrderID,ProductID) 265 | VALUES(OrID,product); 266 | END LOOP; 267 | END; 268 | END; 269 | 270 | 271 | --Orders 272 | CREATE OR REPLACE PROCEDURE Place_Order ( 273 | OrderID Orders.OrderID%TYPE, 274 | UserID Orders.UserID%TYPE, 275 | ShipperID Orders.ShipperID%TYPE 276 | ) 277 | IS 278 | BEGIN 279 | DECLARE 280 | s_cart_id VARCHAR(8); 281 | qty INT; 282 | price DECIMAL; 283 | Tax DECIMAL; 284 | dt DATE; 285 | productList SYS_REFCURSOR; 286 | BEGIN 287 | s_cart_id:=''; 288 | Select Distinct ShoppingCartID into s_cart_id from Shopping_Cart s where s.UserID = UserID; 289 | Products_IN_ShoppingCart ( s_cart_id,productList ); 290 | Insert_Order_Product(OrderID , productList); 291 | Quantity_IN_ShoppingCart(s_cart_id,qty); 292 | PriceEngine(s_cart_id,price); 293 | Tax:=0.1*price; 294 | dt := ''; 295 | Select SYSDATE into dt from dual; 296 | INSERT into Orders(OrderID , 297 | UserID , 298 | ShipperID , 299 | OrderDate , 300 | RequiredDate , 301 | Tax, 302 | TransactionStatus , 303 | PaymentDate , 304 | ItemQuantity , 305 | Price) 306 | VALUES (OrderID , 307 | UserID , 308 | ShipperID , 309 | dt , 310 | dt+7, 311 | Tax, 312 | 'PENDING' , 313 | dt, 314 | qty , 315 | price); 316 | COMMIT; 317 | END; 318 | END; 319 | / 320 | 321 | BEGIN 322 | Place_Order(999,1,'BlueDart'); 323 | END; 324 | 325 | 326 | CREATE OR REPLACE PROCEDURE Insert_Payment_CARD ( 327 | p_paymentID payment.paymentid%TYPE, 328 | p_orderID payment.orderid%TYPE, 329 | p_paymentType payment.payment_type%TYPE, 330 | p_cardid payment_card.cardid%TYPE, 331 | p_cardnumber payment_card.cardnumber%TYPE, 332 | p_cardexpmonth payment_card.cardexpmonth%TYPE, 333 | p_cardexpyear payment_card.cardexpyear%TYPE 334 | ) 335 | IS 336 | BEGIN 337 | 338 | INSERT INTO Payment(paymentid, orderid, payment_type) 339 | 340 | VALUES (p_paymentID, p_orderID, p_paymentType); 341 | 342 | INSERT INTO PAYMENT_CARD(cardid, paymentid, cardnumber, cardexpmonth, cardexpyear) 343 | values (p_cardid, p_paymentID, p_cardnumber, p_cardexpmonth, p_cardexpyear); 344 | 345 | COMMIT; 346 | END; 347 | 348 | BEGIN 349 | Insert_Payment_CARD('XYZ', 999, 'C', '343252', '34456678', '12', '2023'); 350 | END; 351 | 352 | 353 | 354 | 355 | -- Insert payment in payment gift card 356 | 357 | CREATE OR REPLACE PROCEDURE Insert_Payment_GIFT_CARD ( 358 | p_paymentID payment.paymentid%TYPE, 359 | p_orderID payment.orderid%TYPE, 360 | p_paymentType payment.payment_type%TYPE, 361 | p_giftcardid payment_giftcard.giftcardid%TYPE, 362 | p_giftcardamount payment_giftcard.giftcardamount%TYPE, 363 | p_giftcardnumber payment_giftcard.giftcardnumber%TYPE, 364 | p_giftcardexpmonth payment_giftcard.giftcardexpmonth%TYPE, 365 | p_giftcardexpyear payment_giftcard.giftcardexpyear%TYPE 366 | ) 367 | IS 368 | BEGIN 369 | 370 | INSERT INTO Payment(paymentid, orderid, payment_type) 371 | 372 | VALUES (p_paymentID, p_orderID, p_paymentType); 373 | 374 | INSERT INTO PAYMENT_GIFTCARD(giftcardid, paymentid, giftcardamount, giftcardnumber, giftcardexpmonth, giftcardexpyear) 375 | values (p_giftcardid, p_paymentID, p_giftcardamount, p_giftcardnumber, p_giftcardexpmonth, p_giftcardexpyear); 376 | 377 | COMMIT; 378 | END; 379 | 380 | BEGIN 381 | Insert_Payment_GIFT_CARD('456', '999', 'G', '76756465', '100', '332334', '12', '2020'); 382 | END; 383 | 384 | 385 | select * from payment; 386 | select * from payment_card; 387 | select * from payment_giftcard; 388 | 389 | 390 | 391 | -------------------------------------------------------------------------------- /pl_sql_triggers.sql: -------------------------------------------------------------------------------- 1 | 2 | CREATE OR REPLACE TRIGGER CHECK_OFFER_AMOUNT 3 | AFTER INSERT ON OFFER FOR EACH ROW 4 | BEGIN 5 | dbms_output.put_line('CALLING CHECK_OFFER_AMOUNT'); 6 | IF :NEW.OfferAmount > 100 7 | THEN 8 | Raise_Application_Error(-20000, 'Offer Amount Cannot Exceed 100'); 9 | END IF; 10 | END; 11 | 12 | CREATE OR REPLACE TRIGGER CHECK_CART_QUANTITY 13 | AFTER INSERT ON Shopping_Cart FOR EACH ROW 14 | BEGIN 15 | IF :NEW.Quantity > 10 16 | THEN 17 | Raise_Application_Error(-20001, 'Quantity cannot exceed 10'); 18 | END IF; 19 | END; 20 | 21 | 22 | 23 | CREATE OR REPLACE TRIGGER CART_DROP 24 | AFTER INSERT ON Orders FOR EACH ROW 25 | Declare 26 | UID VARCHAR(8); 27 | ShID VARCHAR(8); 28 | BEGIN 29 | Select ShoppingCartID INTO ShID from Shopping_Cart where UserID = :New.UserID; 30 | Delete from Cart_Product where ShoppingCartID = ShID; 31 | Delete from shopping_cart where shoppingcartid = ShID; 32 | END; 33 | 34 | set serveroutput on; 35 | CREATE OR REPLACE TRIGGER Change_Order_Status 36 | AFTER INSERT ON Payment FOR EACH ROW 37 | Declare 38 | BEGIN 39 | Update Orders Set transactionstatus = 'SUCCESS' where orderid = :New.OrderID; 40 | dbms_output.put_line(:New.OrderID); 41 | END; 42 | 43 | 44 | CREATE OR REPLACE TRIGGER Check_inventory 45 | BEFORE INSERT ON Cart_Product FOR EACH ROW 46 | Declare 47 | ProdID VARCHAR(8); 48 | Qty INT; 49 | BEGIN 50 | Select UnitsInStock INTO Qty from Product where ProductID = :NEW.ProductID; 51 | IF Qty <= 0 52 | THEN 53 | Raise_Application_Error(-20002, 'Product Out Of Stock'); 54 | END IF; 55 | END; 56 | --------------------------------------------------------------------------------