0% found this document useful (0 votes)
0 views

SQL Technical Solutions2

The document outlines SQL solutions for various database tasks, including computing student counts by gender, calculating final marks, categorizing students, and creating views for specific data. It also covers procedures for generating performance reports, managing bank and account tables, and handling customer orders. Additionally, it includes triggers, functions, and sample data insertions for demonstration purposes.

Uploaded by

antoniyajeswin
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
0 views

SQL Technical Solutions2

The document outlines SQL solutions for various database tasks, including computing student counts by gender, calculating final marks, categorizing students, and creating views for specific data. It also covers procedures for generating performance reports, managing bank and account tables, and handling customer orders. Additionally, it includes triggers, functions, and sample data insertions for demonstration purposes.

Uploaded by

antoniyajeswin
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 24

Solution a) Compute male and female students by semester and section

sql

SELECT subj.Sem,
SUM(CASE WHEN s.Gender = 'M' THEN 1 ELSE 0 END) AS Male_Count,
SUM(CASE WHEN s.Gender = 'F' THEN 1 ELSE 0 END) AS Female_Count
FROM STUDENT s
JOIN MARKS m ON s.RegNo = m.RegNo
JOIN SUBJECT subj ON m.Subcode = subj.Subcode
GROUP BY subj.Sem
ORDER BY subj.Sem;

Solution b) Calculate Finalmark and update table


sql
CREATE OR REPLACE PROCEDURE calculate_finalmarks IS
BEGIN
FOR rec IN (SELECT RegNo, Subcode, Test1, Test2, Test3 FROM MARKS) LOOP
DECLARE
v_marks NUMBER(5,2);
v_best1 NUMBER;
v_best2 NUMBER;
BEGIN
-- Find best two test marks
IF rec.Test1 >= rec.Test2 AND rec.Test1 >= rec.Test3 THEN
v_best1 := rec.Test1;
IF rec.Test2 >= rec.Test3 THEN
v_best2 := rec.Test2;
ELSE
v_best2 := rec.Test3;
END IF;
ELSIF rec.Test2 >= rec.Test1 AND rec.Test2 >= rec.Test3 THEN
v_best1 := rec.Test2;
IF rec.Test1 >= rec.Test3 THEN
v_best2 := rec.Test1;
ELSE
v_best2 := rec.Test3;
END IF;
ELSE
v_best1 := rec.Test3;
IF rec.Test1 >= rec.Test2 THEN
v_best2 := rec.Test1;
ELSE
v_best2 := rec.Test2;
END IF;
END IF;

-- Calculate average of best two


v_marks := (v_best1 + v_best2) / 2;

-- Update the MARKS table


UPDATE MARKS
SET Finalmark = v_marks
WHERE RegNo = rec.RegNo AND Subcode = rec.Subcode;
END;
END LOOP;

COMMIT;
DBMS_OUTPUT.PUT_LINE('Final marks calculated and updated successfully.');
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;
/

-- Execute the procedure


EXEC calculate_finalmarks;

Solution c) Categorize students based on Finalmark

sql

-- Create a view to categorize students


CREATE OR REPLACE VIEW STUDENT_CATEGORY AS
SELECT m.RegNo, s.StudName, m.Subcode, subj.Title, m.Finalmark,
CASE
WHEN m.Finalmark BETWEEN 81 AND 100 THEN 'Outstanding'
WHEN m.Finalmark BETWEEN 51 AND 80 THEN 'Average'
WHEN m.Finalmark < 51 THEN 'Weak'
ELSE 'Not Evaluated'
END AS CAT
FROM MARKS m
JOIN STUDENT s ON m.RegNo = s.RegNo
JOIN SUBJECT subj ON m.Subcode = subj.Subcode;

-- Query to show the categorization


SELECT * FROM STUDENT_CATEGORY ORDER BY RegNo, Subcode;

Solution d) Create a view of Test3 marks for a particular student

sql

CREATE OR REPLACE VIEW STUDENT_TEST3_MARKS AS


SELECT s.RegNo, s.StudName, m.Subcode, subj.Title, m.Test3
FROM STUDENT s
JOIN MARKS m ON s.RegNo = m.RegNo
JOIN SUBJECT subj ON m.Subcode = subj.Subcode
WHERE s.RegNo = 'S001'; -- Example for student S001

Solution e) Demonstrate a procedure for the College Database


sql
CREATE OR REPLACE PROCEDURE get_student_performance(p_regno VARCHAR2) IS
v_student_name STUDENT.StudName%TYPE;
v_count NUMBER := 0;
v_total_marks NUMBER := 0;
v_avg_mark NUMBER(5,2);
v_outstanding NUMBER := 0;
v_average NUMBER := 0;
v_weak NUMBER := 0;
BEGIN
-- Get student name
SELECT StudName INTO v_student_name
FROM STUDENT
WHERE RegNo = p_regno;

DBMS_OUTPUT.PUT_LINE('Performance Report for: ' || v_student_name || ' (' || p_regno || ')'


DBMS_OUTPUT.PUT_LINE('-------------------------------------------');

-- Print subject-wise performance


FOR rec IN (
SELECT m.Subcode, subj.Title, m.Finalmark,
CASE
WHEN m.Finalmark BETWEEN 81 AND 100 THEN 'Outstanding'
WHEN m.Finalmark BETWEEN 51 AND 80 THEN 'Average'
WHEN m.Finalmark < 51 THEN 'Weak'
ELSE 'Not Evaluated'
END AS Category
FROM MARKS m
JOIN SUBJECT subj ON m.Subcode = subj.Subcode
WHERE m.RegNo = p_regno
) LOOP
DBMS_OUTPUT.PUT_LINE(rec.Subcode || ' - ' || rec.Title || ': ' ||
rec.Finalmark || ' (' || rec.Category || ')');

v_count := v_count + 1;
v_total_marks := v_total_marks + NVL(rec.Finalmark, 0);

IF rec.Category = 'Outstanding' THEN


v_outstanding := v_outstanding + 1;
ELSIF rec.Category = 'Average' THEN
v_average := v_average + 1;
ELSIF rec.Category = 'Weak' THEN
v_weak := v_weak + 1;
END IF;
END LOOP;

-- Calculate average mark


IF v_count > 0 THEN
v_avg_mark := v_total_marks / v_count;
ELSE
v_avg_mark := 0;
END IF;

-- Print summary
DBMS_OUTPUT.PUT_LINE('-------------------------------------------');
DBMS_OUTPUT.PUT_LINE('Summary:');
DBMS_OUTPUT.PUT_LINE('Average Mark: ' || v_avg_mark);
DBMS_OUTPUT.PUT_LINE('Subjects with Outstanding performance: ' || v_outstanding);
DBMS_OUTPUT.PUT_LINE('Subjects with Average performance: ' || v_average);
DBMS_OUTPUT.PUT_LINE('Subjects with Weak performance: ' || v_weak);

EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Student with RegNo ' || p_regno || ' not found.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;
/

-- Execute the procedure


EXEC get_student_performance('S001');

8. Bank Table

Table Creation

sql

CREATE TABLE Bank (


S_No NUMBER PRIMARY KEY,
Cust_Name VARCHAR2(100) NOT NULL,
Acc_No VARCHAR2(20) UNIQUE NOT NULL,
Balance NUMBER(12,2),
Branch VARCHAR2(50)
);

-- Insert sample data


INSERT INTO Bank VALUES (1, 'John Smith', 'ACC001', 5000.50, 'Main Branch');
INSERT INTO Bank VALUES (2, 'Jane Doe', 'ACC002', 800.75, 'Downtown');
INSERT INTO Bank VALUES (3, 'Robert Johnson', 'ACC003', 12500.25, 'Main Branch');
INSERT INTO Bank VALUES (4, 'Alice Williams', 'ACC004', 950.50, 'West End');
INSERT INTO Bank VALUES (5, 'David Brown', 'ACC005', 25000.00, 'East Side');
Solution a) Select with where clause

sql

SELECT * FROM Bank WHERE Branch = 'Main Branch';

Solution b) Select with comparison operator

sql

SELECT Cust_Name, Acc_No, Balance FROM Bank WHERE Balance > 1000;

Solution c) Update balance in second row

sql

UPDATE Bank SET Balance = 1000.00 WHERE S_No = 2;

Solution d) Select with between in the field balance

sql

SELECT * FROM Bank WHERE Balance BETWEEN 1000 AND 10000;

Solution e) Trigger when balance is below 1000

sql

CREATE OR REPLACE TRIGGER low_balance_trigger


BEFORE INSERT OR UPDATE OF Balance ON Bank
FOR EACH ROW
BEGIN
IF :NEW.Balance < 1000 THEN
DBMS_OUTPUT.PUT_LINE('WARNING: Account ' || :NEW.Acc_No ||
' balance is below the minimum threshold of 1000');
-- Could also send notification, update another table, etc.
END IF;
END;
/

-- Test the trigger


UPDATE Bank SET Balance = 750 WHERE S_No = 3;

9. Account Table

Table Creation
sql

CREATE TABLE Account (


Account_No VARCHAR2(20) PRIMARY KEY,
Cust_Name VARCHAR2(100) NOT NULL,
Branch_Name VARCHAR2(50),
Account_Balance NUMBER(12,2),
Account_Type VARCHAR2(20) CHECK (Account_Type IN ('Savings', 'Current', 'Fixed'))
);

-- Insert sample data


INSERT INTO Account VALUES ('ACC001', 'John Smith', 'Main Branch', 5000.50, 'Savings');
INSERT INTO Account VALUES ('ACC002', 'Jane Doe', 'Downtown', 15000.75, 'Current');
INSERT INTO Account VALUES ('ACC003', 'Robert Johnson', 'Main Branch', 12500.25, 'Savings');
INSERT INTO Account VALUES ('ACC004', 'Alice Williams', 'West End', 950.50, 'Savings');
INSERT INTO Account VALUES ('ACC005', 'David Brown', 'East Side', 25000.00, 'Fixed');

Solution a) Display customers of specific branch

sql

SELECT Cust_Name, Account_No


FROM Account
WHERE Branch_Name = 'Main Branch';

Solution b) Display customers with balance > 10000

sql

SELECT Cust_Name, Account_Type


FROM Account
WHERE Account_Balance > 10000;

Solution c) Add DOB column

sql

ALTER TABLE Account ADD Cust_Date_of_Birth DATE;

-- Update with sample data


UPDATE Account SET Cust_Date_of_Birth = TO_DATE('15-JAN-1980', 'DD-MON-YYYY') WHERE Account_No
UPDATE Account SET Cust_Date_of_Birth = TO_DATE('22-MAR-1985', 'DD-MON-YYYY') WHERE Account_No
UPDATE Account SET Cust_Date_of_Birth = TO_DATE('10-SEP-1990', 'DD-MON-YYYY') WHERE Account_No
UPDATE Account SET Cust_Date_of_Birth = TO_DATE('05-DEC-1975', 'DD-MON-YYYY') WHERE Account_No
UPDATE Account SET Cust_Date_of_Birth = TO_DATE('18-JUL-1982', 'DD-MON-YYYY') WHERE Account_No

 
Solution d) Display customers with balance < 1000

sql

SELECT Account_No, Cust_Name, Branch_Name


FROM Account
WHERE Account_Balance < 1000;

Solution e) Procedure for Account Database


sql
CREATE OR REPLACE PROCEDURE account_summary(p_branch_name VARCHAR2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Account Summary for Branch: ' || p_branch_name);
DBMS_OUTPUT.PUT_LINE('----------------------------------------------');
DBMS_OUTPUT.PUT_LINE('Account Type | Count | Total Balance | Average Balance');
DBMS_OUTPUT.PUT_LINE('----------------------------------------------');

FOR rec IN (
SELECT Account_Type,
COUNT(*) as Acct_Count,
SUM(Account_Balance) as Total_Balance,
ROUND(AVG(Account_Balance), 2) as Avg_Balance
FROM Account
WHERE Branch_Name = p_branch_name
GROUP BY Account_Type
) LOOP
DBMS_OUTPUT.PUT_LINE(RPAD(rec.Account_Type, 12) || ' | ' ||
LPAD(TO_CHAR(rec.Acct_Count), 5) || ' | ' ||
LPAD(TO_CHAR(rec.Total_Balance, '999,999.99'), 13) || ' | ' ||
LPAD(TO_CHAR(rec.Avg_Balance, '999,999.99'), 14));
END LOOP;

-- Show branch total


DECLARE
v_total_accts NUMBER;
v_total_bal NUMBER;
BEGIN
SELECT COUNT(*), SUM(Account_Balance)
INTO v_total_accts, v_total_bal
FROM Account
WHERE Branch_Name = p_branch_name;

DBMS_OUTPUT.PUT_LINE('----------------------------------------------');
DBMS_OUTPUT.PUT_LINE('TOTAL | ' ||
LPAD(TO_CHAR(v_total_accts), 5) || ' | ' ||
LPAD(TO_CHAR(v_total_bal, '999,999.99'), 13) || ' | ');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No accounts found for branch: ' || p_branch_name);
END;

EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No data found for branch: ' || p_branch_name);
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;
/

-- Execute the procedure


EXEC account_summary('Main Branch');

10. Customer and Order System

Table Creation

sql

CREATE TABLE CUSTOMER (


C_ID NUMBER PRIMARY KEY,
Name VARCHAR2(100) NOT NULL,
Address VARCHAR2(200),
City VARCHAR2(50),
Mobile_No VARCHAR2(20)
);

CREATE TABLE "ORDER" (


C_ID NUMBER,
P_ID NUMBER,
P_Name VARCHAR2(100),
P_COST NUMBER(10,2),
PRIMARY KEY (C_ID, P_ID),
FOREIGN KEY (C_ID) REFERENCES CUSTOMER(C_ID)
);

-- Insert sample data


INSERT INTO CUSTOMER VALUES (1, 'John Smith', '123 Main St', 'New York', '555-1234');
INSERT INTO CUSTOMER VALUES (2, 'Jane Doe', '456 Oak Ave', 'Chicago', '555-5678');
INSERT INTO CUSTOMER VALUES (3, 'Robert Johnson', '789 Pine Blvd', 'Los Angeles', '555-9012');
INSERT INTO CUSTOMER VALUES (4, 'Alice Williams', '321 Elm St', 'Delhi', '555-3456');
INSERT INTO CUSTOMER VALUES (5, 'David Brown', '654 Maple Dr', 'Delhi', '555-7890');

INSERT INTO "ORDER" VALUES (1, 101, 'Laptop', 1200.00);


INSERT INTO "ORDER" VALUES (1, 102, 'Printer', 350.00);
INSERT INTO "ORDER" VALUES (2, 103, 'Smartphone', 800.00);
INSERT INTO "ORDER" VALUES (3, 104, 'Tablet', 600.00);
INSERT INTO "ORDER" VALUES (4, 105, 'Monitor', 450.00);
INSERT INTO "ORDER" VALUES (4, 106, 'Keyboard', 80.00);
INSERT INTO "ORDER" VALUES (5, 107, 'External Hard Drive', 120.00);
INSERT INTO "ORDER" VALUES (5, 108, 'Gaming Console', 550.00);

 

Solution a) List customers who ordered products > 500


sql

SELECT DISTINCT c.Name, c.Address


FROM CUSTOMER c
JOIN "ORDER" o ON c.C_ID = o.C_ID
WHERE o.P_COST > 500
ORDER BY c.Name;

Solution b) List products with cost >= 1000

sql

SELECT P_Name
FROM "ORDER"
WHERE P_COST >= 1000
ORDER BY P_Name;

Solution c) List products ordered by customers from Delhi

sql

SELECT o.P_Name
FROM "ORDER" o
JOIN CUSTOMER c ON o.C_ID = c.C_ID
WHERE c.City = 'Delhi'
ORDER BY o.P_Name;

Solution d) Add Email_id column

sql

ALTER TABLE CUSTOMER ADD Email_id VARCHAR2(100);

-- Update with sample data


UPDATE CUSTOMER SET Email_id = '[email protected]' WHERE C_ID = 1;
UPDATE CUSTOMER SET Email_id = '[email protected]' WHERE C_ID = 2;
UPDATE CUSTOMER SET Email_id = '[email protected]' WHERE C_ID = 3;
UPDATE CUSTOMER SET Email_id = '[email protected]' WHERE C_ID = 4;
UPDATE CUSTOMER SET Email_id = '[email protected]' WHERE C_ID = 5;

Solution e) User defined function


sql

CREATE OR REPLACE FUNCTION get_customer_order_total(p_cid NUMBER)


RETURN NUMBER IS
v_total NUMBER;
BEGIN
SELECT NVL(SUM(P_COST), 0)
INTO v_total
FROM "ORDER"
WHERE C_ID = p_cid;

RETURN v_total;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 0;
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
RETURN -1;
END;
/

-- Test the function


SET SERVEROUTPUT ON
DECLARE
v_cid NUMBER := 1;
v_name CUSTOMER.Name%TYPE;
v_total NUMBER;
BEGIN
SELECT Name INTO v_name FROM CUSTOMER WHERE C_ID = v_cid;
v_total := get_customer_order_total(v_cid);

DBMS_OUTPUT.PUT_LINE('Customer: ' || v_name);


DBMS_OUTPUT.PUT_LINE('Total order value: $' || v_total);
END;
/

11. Salesman Database

Table Creation
sql
CREATE TABLE SALESMAN (
Salesman_id NUMBER PRIMARY KEY,
Name VARCHAR2(100) NOT NULL,
City VARCHAR2(50),
Commission NUMBER(5,2) CHECK (Commission BETWEEN 0 AND 100)
);

CREATE TABLE CUSTOMER (


Customer_id NUMBER PRIMARY KEY,
Cust_Name VARCHAR2(100) NOT NULL,
City VARCHAR2(50),
Grade NUMBER(3),
Salesman_id NUMBER,
FOREIGN KEY (Salesman_id) REFERENCES SALESMAN(Salesman_id) ON DELETE SET NULL
);

CREATE TABLE ORDERS (


Ord_No NUMBER PRIMARY KEY,
Purchase_Amt NUMBER(10,2),
Ord_Date DATE,
Customer_id NUMBER,
Salesman_id NUMBER,
FOREIGN KEY (Customer_id) REFERENCES CUSTOMER(Customer_id),
FOREIGN KEY (Salesman_id) REFERENCES SALESMAN(Salesman_id) ON DELETE CASCADE
);

-- Insert sample data


INSERT INTO SALESMAN VALUES (1000, 'John Smith', 'New York', 15);
INSERT INTO SALESMAN VALUES (1001, 'Jane Doe', 'Chicago', 12.5);
INSERT INTO SALESMAN VALUES (1002, 'Robert Johnson', 'London', 10);
INSERT INTO SALESMAN VALUES (1003, 'Alice Williams', 'Paris', 13);
INSERT INTO SALESMAN VALUES (1004, 'David Brown', 'New York', 11);

INSERT INTO CUSTOMER VALUES (101, 'Tom Wilson', 'New York', 3, 1000);
INSERT INTO CUSTOMER VALUES (102, 'Sarah Davis', 'Chicago', 2, 1001);
INSERT INTO CUSTOMER VALUES (103, 'James Taylor', 'London', 3, 1002);
INSERT INTO CUSTOMER VALUES (104, 'Lisa Anderson', 'Paris', 4, 1003);
INSERT INTO CUSTOMER VALUES (105, 'Mark Thompson', 'New York', 2, 1000);
INSERT INTO CUSTOMER VALUES (106, 'Emily Clark', 'Chicago', 1, 1001);
INSERT INTO CUSTOMER VALUES (107, 'Michael Harris', 'London', 2, 1002);
INSERT INTO CUSTOMER VALUES (108, 'Jessica Martin', 'New York', 3, 1004);

INSERT INTO ORDERS VALUES (1, 1200.50, TO_DATE('10-JAN-2023', 'DD-MON-YYYY'), 101, 1000);
INSERT INTO ORDERS VALUES (2, 850.25, TO_DATE('15-JAN-2023', 'DD-MON-YYYY'), 102, 1001);
INSERT INTO ORDERS VALUES (3, 1500.75, TO_DATE('20-JAN-2023', 'DD-MON-YYYY'), 103, 1002);
INSERT INTO ORDERS VALUES (4, 975.00, TO_DATE('25-JAN-2023', 'DD-MON-YYYY'), 104, 1003);
INSERT INTO ORDERS VALUES (5, 2100.00, TO_DATE('05-FEB-2023', 'DD-MON-YYYY'), 105, 1000);
INSERT INTO ORDERS VALUES (6, 1350.50, TO_DATE('10-FEB-2023', 'DD-MON-YYYY'), 106, 1001);
INSERT INTO ORDERS VALUES (7, 500.25, TO_DATE('15-FEB-2023', 'DD-MON-YYYY'), 107, 1002);
INSERT INTO ORDERS VALUES (8, 3200.00, TO_DATE('20-FEB-2023', 'DD-MON-YYYY'), 108, 1004);
INSERT INTO ORDERS VALUES (9, 1800.75, TO_DATE('25-FEB-2023', 'DD-MON-YYYY'), 101, 1000);
INSERT INTO ORDERS VALUES (10, 950.50, TO_DATE('01-MAR-2023', 'DD-MON-YYYY'), 103, 1002);

Solution a) Find salesmen with more than one customer

sql

SELECT s.Salesman_id, s.Name


FROM SALESMAN s
WHERE s.Salesman_id IN (
SELECT Salesman_id
FROM CUSTOMER
GROUP BY Salesman_id
HAVING COUNT(*) > 1
)
ORDER BY s.Salesman_id;

Solution b) List salesmen with/without customers in their cities (UNION)

sql

-- Salesmen who have customers in their cities


SELECT s.Salesman_id, s.Name, s.City, 'Has customers in city' AS Status
FROM SALESMAN s
WHERE EXISTS (
SELECT 1
FROM CUSTOMER c
WHERE c.Salesman_id = s.Salesman_id AND c.City = s.City
)
UNION
-- Salesmen who don't have customers in their cities
SELECT s.Salesman_id, s.Name, s.City, 'No customers in city' AS Status
FROM SALESMAN s
WHERE NOT EXISTS (
SELECT 1
FROM CUSTOMER c
WHERE c.Salesman_id = s.Salesman_id AND c.City = s.City
)
ORDER BY Salesman_id;

Solution c) Create a view for salesman with highest order


sql

CREATE OR REPLACE VIEW TopSalesman AS


SELECT s.Salesman_id, s.Name, o.Ord_Date, o.Purchase_Amt
FROM SALESMAN s
JOIN (
SELECT Ord_Date, MAX(Purchase_Amt) AS Max_Amt
FROM ORDERS
GROUP BY Ord_Date
) m ON m.Ord_Date = o.Ord_Date AND m.Max_Amt = o.Purchase_Amt
JOIN ORDERS o ON s.Salesman_id = o.Salesman_id
ORDER BY o.Ord_Date;

Solution d) Delete salesman with id 1000

sql

DELETE FROM SALESMAN WHERE Salesman_id = 1000;


-- Due to ON DELETE CASCADE, this will also delete orders from this salesman
-- Due to ON DELETE SET NULL, customer records will set Salesman_id to NULL

Solution e) Demonstrate triggers


sql
CREATE OR REPLACE TRIGGER commission_update_trigger
BEFORE UPDATE OF Commission ON SALESMAN
FOR EACH ROW
BEGIN
-- Log commission changes
DBMS_OUTPUT.PUT_LINE('Salesman ID: ' || :OLD.Salesman_id ||
' Commission changing from ' || :OLD.Commission ||
'% to ' || :NEW.Commission || '%');

-- Additional business logic could be added here


-- For example, limit commission increases to 5% at a time
IF :NEW.Commission > :OLD.Commission + 5 THEN
:NEW.Commission := :OLD.Commission + 5;
DBMS_OUTPUT.PUT_LINE('Commission increase limited to 5%. New value: ' || :NEW.Commissio
END IF;
END;
/

-- Create a trigger for order insertion


CREATE OR REPLACE TRIGGER new_order_trigger
AFTER INSERT ON ORDERS
FOR EACH ROW
DECLARE
v_salesman_name SALESMAN.Name%TYPE;
v_customer_name CUSTOMER.Cust_Name%TYPE;
BEGIN
-- Get salesman and customer names
SELECT Name INTO v_salesman_name
FROM SALESMAN
WHERE Salesman_id = :NEW.Salesman_id;

SELECT Cust_Name INTO v_customer_name


FROM CUSTOMER
WHERE Customer_id = :NEW.Customer_id;

-- Log the new order


DBMS_OUTPUT.PUT_LINE('New order #' || :NEW.Ord_No || ' recorded:');
DBMS_OUTPUT.PUT_LINE('Date: ' || TO_CHAR(:NEW.Ord_Date, 'DD-MON-YYYY'));
DBMS_OUTPUT.PUT_LINE('Amount: $' || :NEW.Purchase_Amt);
DBMS_OUTPUT.PUT_LINE('Customer: ' || v_customer_name);
DBMS_OUTPUT.PUT_LINE('Salesman: ' || v_salesman_name);

-- Calculate commission amount


DECLARE
v_commission_rate SALESMAN.Commission%TYPE;
v_commission_amount NUMBER(10,2);
BEGIN
SELECT Commission INTO v_commission_rate
FROM SALESMAN
WHERE Salesman_id = :NEW.Salesman_id;

v_commission_amount := :NEW.Purchase_Amt * (v_commission_rate / 100);


DBMS_OUTPUT.PUT_LINE('Commission (' || v_commission_rate || '%): $' || v_commission_amo
END;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Error: Salesman or Customer not found');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END;
/

-- Test the triggers


UPDATE SALESMAN SET Commission = 18 WHERE Salesman_id = 1001;

INSERT INTO ORDERS VALUES (11, 2200.00, SYSDATE, 102, 1001);

12-29. Additional Database Operations


The remaining questions (12-29) cover similar database operations with slight variations. Here are
implementations for a few key ones:

Bank Database (Question 12)


sql

-- Create Bank Database


CREATE TABLE Bank_Account (
Account_No VARCHAR2(20) PRIMARY KEY,
Customer_Name VARCHAR2(100) NOT NULL,
Balance NUMBER(12,2) CHECK (Balance >= 0),
Account_Type VARCHAR2(20),
Opening_Date DATE DEFAULT SYSDATE
);

-- Insert sample data


INSERT INTO Bank_Account VALUES ('BA001', 'John Smith', 1200000.50, 'Savings', TO_DATE('10-JAN-
INSERT INTO Bank_Account VALUES ('BA002', 'Jane Doe', 1500000.75, 'Current', TO_DATE('15-FEB-20
INSERT INTO Bank_Account VALUES ('BA003', 'Robert Johnson', 800000.25, 'Savings', TO_DATE('20-M
INSERT INTO Bank_Account VALUES ('BA004', 'Alice Williams', 2000000.00, 'Fixed', TO_DATE('25-AP
INSERT INTO Bank_Account VALUES ('BA005', 'David Brown', 750000.50, 'Savings', TO_DATE('30-MAY-

-- PL/SQL program to retrieve depositors with balance above 10 lakhs


CREATE OR REPLACE PROCEDURE get_high_balance_accounts IS
BEGIN
DBMS_OUTPUT.PUT_LINE('High Balance Account Holders (Above 10 Lakhs):');
DBMS_OUTPUT.PUT_LINE('------------------------------------------------');
DBMS_OUTPUT.PUT_LINE('Account No | Customer Name | Balance | Account Type');
DBMS_OUTPUT.PUT_LINE('------------------------------------------------');

FOR acc IN (
SELECT *
FROM Bank_Account
WHERE Balance > 1000000
HAVING Account_Type = 'Savings' -- Example of HAVING clause
ORDER BY Balance DESC
) LOOP
DBMS_OUTPUT.PUT_LINE(acc.Account_No || ' | ' ||
acc.Customer_Name || ' | ' ||
TO_CHAR(acc.Balance, '999,999,999.99') || ' | ' ||
acc.Account_Type);
END LOOP;
END;
/

-- Execute the procedure


EXEC get_high_balance_accounts;

 

Cargo Service Database (Question 13)


sql

-- Create Cargo Service Database


CREATE TABLE Cargo_Company (
Company_ID NUMBER PRIMARY KEY,
Company_Name VARCHAR2(100) NOT NULL,
Contact_Number VARCHAR2(20),
Email VARCHAR2(100)
);

CREATE TABLE Cargo_Customer (


Customer_ID NUMBER PRIMARY KEY,
Customer_Name VARCHAR2(100) NOT NULL,
Address VARCHAR2(200),
Contact_Number VARCHAR2(20),
Email VARCHAR2(100)
);

CREATE TABLE Cargo_Booking (


Booking_ID NUMBER PRIMARY KEY,
Customer_ID NUMBER NOT NULL,
Company_ID NUMBER NOT NULL,
Source_Location VARCHAR2(100) NOT NULL,
Destination VARCHAR2(100) NOT NULL,
Booking_Date DATE DEFAULT SYSDATE,
Delivery_Date DATE,
Weight NUMBER(10,2),
Cost NUMBER(12,2),
Status VARCHAR2(20) DEFAULT 'Booked',
FOREIGN KEY (Customer_ID) REFERENCES Cargo_Customer(Customer_ID),
FOREIGN KEY (Company_ID) REFERENCES Cargo_Company(Company_ID),
CONSTRAINT chk_delivery_date CHECK (Delivery_Date > Booking_Date),
CONSTRAINT chk_status CHECK (Status IN ('

You might also like