Building a Real-Time Inventory System in PL/SQL
Build a real-time inventory system example using:
Inventory and transaction tables
Data records
A cursor for low-stock alerts
A trigger for auditing sales
✅ Inventory System
Tables:
tblProducts
: holds product details and stocktblSales
: tracks product salestblSales_Audit
: logs all sales automatically via trigger
✅ Step 1: Create Tables
-- Product master table
CREATE TABLE tblProducts (
product_id NUMBER PRIMARY KEY,
product_name VARCHAR2(100) NOT NULL,
quantity NUMBER(10) NOT NULL,
price NUMBER(10,2) NOT NULL
);
-- Sales table
CREATE TABLE tblSales (
sale_id NUMBER PRIMARY KEY,
product_id NUMBER NOT NULL,
quantity_sold NUMBER NOT NULL,
sale_date DATE DEFAULT SYSDATE,
FOREIGN KEY (product_id) REFERENCES tblProducts(product_id)
);
-- Sales audit table
CREATE TABLE tblSales_Audit (
audit_id NUMBER PRIMARY KEY,
sale_id NUMBER,
product_id NUMBER,
quantity NUMBER,
action VARCHAR2(20),
log_time DATE
);
✅ Step 2: Create Sequences
CREATE SEQUENCE seq_product_id START WITH 1;
CREATE SEQUENCE seq_sale_id START WITH 1001;
CREATE SEQUENCE seq_audit_id START WITH 5001;
✅ Step 3: Insert Sample Products
INSERT INTO tblProducts VALUES (seq_product_id.NEXTVAL, 'Laptop', 10, 60000);
INSERT INTO tblProducts VALUES (seq_product_id.NEXTVAL, 'Mouse', 100, 400);
INSERT INTO tblProducts VALUES (seq_product_id.NEXTVAL, 'Keyboard', 50, 800);
INSERT INTO tblProducts VALUES (seq_product_id.NEXTVAL, 'Monitor', 15, 10000);
INSERT INTO tblProducts VALUES (seq_product_id.NEXTVAL, 'Printer', 5, 15000);
COMMIT;
✅ Cursor Example: Show Low Stock Products
DECLARE
CURSOR cur_low_stock IS
SELECT product_name, quantity
FROM tblProducts
WHERE quantity < 10;
v_name tblProducts.product_name%TYPE;
v_qty tblProducts.quantity%TYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE('Low Stock Items:');
FOR rec IN cur_low_stock LOOP
DBMS_OUTPUT.PUT_LINE('Product: ' || rec.product_name || ', Stock: ' || rec.quantity);
END LOOP;
END;
/
✅ Use Case:
Used to alert purchase department of low-stock items
Could also trigger reorder workflow in a real system
✅ Trigger Example: Audit Each Sale
Trigger to Log Sale into tblSales_Audit
CREATE OR REPLACE TRIGGER trg_audit_salesAFTER INSERT ON tblSalesFOR EACH ROWBEGIN INSERT INTO tblSales_Audit ( audit_id, sale_id, product_id, quantity, action, log_time ) VALUES ( seq_audit_id.NEXTVAL, :NEW.sale_id, :NEW.product_id, :NEW.quantity_sold, 'SALE', SYSDATE );END;/
✅ Procedure Example: Sell a Product with Stock Check
CREATE OR REPLACE PROCEDURE sp_sell_product(
p_product_id IN tblProducts.product_id%TYPE,
p_qty IN tblSales.quantity_sold%TYPE
)
AS
v_stock tblProducts.quantity%TYPE;
v_price tblProducts.price%TYPE;
BEGIN
SELECT quantity, price INTO v_stock, v_price
FROM tblProducts
WHERE product_id = p_product_id;
IF v_stock < p_qty THEN
DBMS_OUTPUT.PUT_LINE('Not enough stock!');
RETURN;
END IF;
-- Insert into sales table
INSERT INTO tblSales (sale_id, product_id, quantity_sold)
VALUES (seq_sale_id.NEXTVAL, p_product_id, p_qty);
-- Update stock
UPDATE tblProducts
SET quantity = quantity - p_qty
WHERE product_id = p_product_id;
DBMS_OUTPUT.PUT_LINE('Sale completed. Total: ₹' || (p_qty * v_price));
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Product not found.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;
/
✅ Test the Full Flow
-- Sell 3 monitors
BEGIN
sp_sell_product(4, 3);
END;
/
-- Sell 6 printers (should fail if stock < 6)
BEGIN
sp_sell_product(5, 6);
END;
/
-- Show low stock report
-- (should include Printer if below 10)
✅ View Results
SELECT * FROM tblProducts;
SELECT * FROM tblSales;
SELECT * FROM tblSales_Audit;
✅ Summary
Feature | Demo Provided |
---|---|
Tables | Products, Sales, Sales_Audit |
Sequence | Auto ID for all tables |
Cursor | Low stock checker |
Trigger | Sale audit logger |
Procedure | Product sale with validation |
Comments
Post a Comment