Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 1 DATABASE MANAGEMENT SYSTEMS LABORATORY Batch 1 - Practical Examination Compact Learning Edition - Oracle SQL / PL-SQL (Questions 1 to 20) How to use this document • Each question is one short, self-contained script with a one-line Key idea to remember. Copy the whole code box for a question and paste it into your SQL tool; every sub-question is marked with a comment such as -- 3. • Written for Oracle (SQL*Plus, SQL Developer, or Oracle Live SQL) because the paper uses PL/SQL. Run it as a script (F5 in SQL Developer). • No DROP statements, so a clean run shows no errors. Table names that would clash between questions carry a number (Customer_3, Customer_4 ...). To repeat a question, drop its tables first ( DROP TABLE name CASCADE CONSTRAINTS; ). • Lines containing only / end a PL/SQL block - keep them. SET SERVEROUTPUT ON makes DBMS_OUTPUT text visible (SQL*Plus / SQL Developer). • Inserting data (SQL*Plus): each table has one INSERT written with &variables, followed by / lines. Run the INSERT, type the values when asked, then every / runs the same INSERT again and asks for the next row. INSERT + 4 x / = 5 rows. • Type text without quotes (the quotes are already in the command), dates as DD-MM-YYYY , and type NULL for an empty number. Fill parent tables before child tables so foreign keys match. SET VERIFY OFF hides the old/new lines. • Where the paper is ambiguous, a short Note under the question heading states the assumption used. Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 2 Contents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Question 1 - Workers Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Question 2 - Student and Mark Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Question 3 - Loan Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Question 4 - Banking Enterprise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Question 5 - Hostel Management System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Question 6 - Employee Management System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Question 7 - Employee Relational Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Question 8 - Salesman and Customer Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Question 9 - Book Management System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Question 10 - Loan Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Question 11 - Student and Mark Details . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Question 12 - Employee and Department Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Question 13 - Student Database and View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Question 14 - Timetable Generation System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Question 15 - IoT Simulator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Question 16 - Student Course Enrollment . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Question 17 - Customer Loan Management System . . . . . . . . . . . . . . . . . . . . . . . . . 21 Question 18 - Placement and Training Cell (Function) . . . . . . . . . . . . . . . . . . . . . . . . 22 Question 19 - Placement and Training Cell (Procedure) . . . . . . . . . . . . . . . . . . . . . . . . . 23 Question 20 - Department Validation Using Function Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 3 Question 1 - Workers Table Question 1 - Workers Table Key idea: DDL = CREATE / ALTER / TRUNCATE (auto-commit). TCL = COMMIT / SAVEPOINT / ROLLBACK. Note: 'Employee' in items 4 and 5 is taken as the Workers table. -- 1. Create CREATE TABLE Workers ( S_No NUMBER PRIMARY KEY , Name VARCHAR2(20), Designation VARCHAR2(20), Branch VARCHAR2(20)); -- Workers: enter 5 rows (INSERT once + 4 x /) INSERT INTO Workers VALUES (&S_No,'&Name','&Designation','&Branch'); / / / / -- 2. Add a column 3. Modify a column 4. Describe ALTER TABLE Workers ADD Salary NUMBER(10,2); ALTER TABLE Workers MODIFY Name VARCHAR2(50); DESC Workers; -- 5. Copy the table as Emp CREATE TABLE Emp AS SELECT * FROM Workers; -- 6. Truncate (removes all rows, cannot be rolled back) TRUNCATE TABLE Workers; -- Workers: enter 5 rows (INSERT once + 4 x /) INSERT INTO Workers VALUES (&S_No,'&Name','&Designation','&Branch',&Salary); / / / / -- 7. Delete the second row DELETE FROM Workers WHERE S_No = 2; COMMIT ; -- 8. Student table with TCL CREATE TABLE Student_1 (Regno NUMBER PRIMARY KEY , Name VARCHAR2(30), Dept VARCHAR2(10)); -- Student_1: enter 2 rows (INSERT once + 1 x /) INSERT INTO Student_1 VALUES (&Regno,'&Name','&Dept'); / COMMIT ; -- rows 1, 2 are permanent -- Student_1: one row INSERT INTO Student_1 VALUES (&Regno,'&Name','&Dept'); SAVEPOINT sp1; -- bookmark -- Student_1: one row INSERT INTO Student_1 VALUES (&Regno,'&Name','&Dept'); ROLLBACK TO sp1; -- undoes row 4 only ROLLBACK ; -- undoes row 3 (everything since the COMMIT) Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 4 Question 2 - Student and Mark Details Question 2 - Student and Mark Details Key idea: BETWEEN = range, LIKE 'A%' = starts with A, JOIN = combine tables on a common column. CREATE TABLE Student_Details ( Register_No NUMBER PRIMARY KEY , Student_Name VARCHAR2(30), DOB DATE, Address VARCHAR2(50), City VARCHAR2(20)); CREATE TABLE Mark_Details_2 ( Register_No NUMBER REFERENCES Student_Details(Register_No), Mark1 NUMBER, Mark2 NUMBER, Mark3 NUMBER, Total NUMBER); -- Student_Details: enter 5 rows (INSERT once + 4 x /) INSERT INTO Student_Details VALUES (&Register_No,'&Student_Name',TO_DATE('&DOB','DD-MM-YYYY'),'&Address','&City'); / / / / -- Mark_Details_2: enter 5 rows (INSERT once + 4 x /) INSERT INTO Mark_Details_2 VALUES (&Register_No,&Mark1,&Mark2,&Mark3,&Total); / / / / -- 1. Total between 250 and 300 SELECT * FROM Mark_Details_2 WHERE Total BETWEEN 250 AND 300; -- 2. Drop Mark_Details, delete Register_No 161 DROP TABLE Mark_Details_2; DELETE FROM Student_Details WHERE Register_No = 161; -- 3. Names beginning with 'A' SELECT * FROM Student_Details WHERE Student_Name LIKE 'A%'; -- 4. Employee database and JOINs CREATE TABLE Department_2 (Deptno NUMBER PRIMARY KEY , Dname VARCHAR2(20)); CREATE TABLE Employee_2 ( Empno NUMBER PRIMARY KEY , Ename VARCHAR2(20), Deptno NUMBER REFERENCES Department_2(Deptno)); -- Department_2: enter 5 rows (INSERT once + 4 x /) INSERT INTO Department_2 VALUES (&Deptno,'&Dname'); / / / / -- Employee_2: enter 5 rows (INSERT once + 4 x /) INSERT INTO Employee_2 VALUES (&Empno,'&Ename',&Deptno); / / / / SELECT e.Ename, d.Dname FROM Employee_2 e INNER JOIN Department_2 d ON e.Deptno = d.Deptno; SELECT e.Ename, d.Dname FROM Employee_2 e LEFT JOIN Department_2 d ON e.Deptno = d.Deptno; SELECT e.Ename, d.Dname FROM Employee_2 e RIGHT JOIN Department_2 d ON e.Deptno = d.Deptno; SELECT e.Ename, d.Dname FROM Employee_2 e FULL JOIN Department_2 d ON e.Deptno = d.Deptno; Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 5 Question 3 - Loan Database Question 3 - Loan Database Key idea: CHECK = rule on a column. GROUP BY + SUM = total per group. LEFT JOIN keeps customers with 0 loans. CREATE TABLE Customer_3 ( Customer_ID NUMBER PRIMARY KEY , Customer_Name VARCHAR2(30), Age NUMBER(3), Phone_No VARCHAR2(15)); CREATE TABLE Loan_3 ( Loan_ID VARCHAR2(10) PRIMARY KEY , Amount NUMBER(12,2), Customer_ID NUMBER REFERENCES Customer_3(Customer_ID), CONSTRAINT chk_loan_id CHECK (Loan_ID LIKE 'L%')); -- 1. must start with L CREATE TABLE Student_3 ( Student_ID NUMBER PRIMARY KEY , First_Name VARCHAR2(20), Last_Name VARCHAR2(20), Phone_Number VARCHAR2(15)); -- Customer_3: enter 5 rows (INSERT once + 4 x /) INSERT INTO Customer_3 VALUES (&Customer_ID,'&Customer_Name',&Age,'&Phone_No'); / / / / -- Loan_3: enter 5 rows (INSERT once + 4 x /) INSERT INTO Loan_3 VALUES ('&Loan_ID',&Amount,&Customer_ID); / / / / -- Student_3: enter 5 rows (INSERT once + 4 x /) INSERT INTO Student_3 VALUES (&Student_ID,'&First_Name','&Last_Name','&Phone_Number'); / / / / -- 2. Total loan amount per customer SELECT Customer_ID, SUM(Amount) AS Total_Loan FROM Loan_3 GROUP BY Customer_ID; -- 3. Customers with less than two loans SELECT c.Customer_ID, c.Customer_Name FROM Customer_3 c LEFT JOIN Loan_3 l ON l.Customer_ID = c.Customer_ID GROUP BY c.Customer_ID, c.Customer_Name HAVING COUNT(l.Loan_ID) < 2; -- 4. View on the Student table CREATE OR REPLACE VIEW Student_View AS SELECT Student_ID, First_Name, Last_Name, Phone_Number FROM Student_3; Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 6 Question 4 - Banking Enterprise Question 4 - Banking Enterprise Key idea: PRIMARY KEY identifies a row; REFERENCES (foreign key) links tables. 'At least two' = HAVING COUNT >= 2. Note: Query 4 is relational division: the number of that city's branches the customer has accounts in must equal the total number of branches in that city. -- 1. Tables with primary and foreign keys CREATE TABLE Branch ( Branch_Name VARCHAR2(20) PRIMARY KEY , Branch_City VARCHAR2(20), Assets NUMBER(14,2)); CREATE TABLE Account ( Acc_No VARCHAR2(10) PRIMARY KEY , Branch_Name VARCHAR2(20) REFERENCES Branch(Branch_Name), Balance NUMBER(12,2)); CREATE TABLE Customer_4 ( Customer_Name VARCHAR2(20) PRIMARY KEY , Customer_Street VARCHAR2(30), Customer_City VARCHAR2(20)); CREATE TABLE Depositor ( Customer_Name VARCHAR2(20) REFERENCES Customer_4(Customer_Name), Acc_No VARCHAR2(10) REFERENCES Account(Acc_No), PRIMARY KEY (Customer_Name, Acc_No)); CREATE TABLE Loan_4 ( Loan_Number VARCHAR2(10) PRIMARY KEY , Branch_Name VARCHAR2(20) REFERENCES Branch(Branch_Name), Amount NUMBER(12,2)); CREATE TABLE Borrower ( Customer_Name VARCHAR2(20) REFERENCES Customer_4(Customer_Name), Loan_Number VARCHAR2(10) REFERENCES Loan_4(Loan_Number), PRIMARY KEY (Customer_Name, Loan_Number)); -- 2. Insert 5 rows into EACH table (parent tables first) -- Branch: enter 5 rows (INSERT once + 4 x /) INSERT INTO Branch VALUES ('&Branch_Name','&Branch_City',&Assets); / / / / -- Customer_4: enter 5 rows (INSERT once + 4 x /) INSERT INTO Customer_4 VALUES ('&Customer_Name','&Customer_Street','&Customer_City'); / / / / -- Account: enter 5 rows (INSERT once + 4 x /) INSERT INTO Account VALUES ('&Acc_No','&Branch_Name',&Balance); / / / / -- Depositor: enter 5 rows (INSERT once + 4 x /) INSERT INTO Depositor VALUES ('&Customer_Name','&Acc_No'); / / / / -- Loan_4: enter 5 rows (INSERT once + 4 x /) INSERT INTO Loan_4 VALUES ('&Loan_Number','&Branch_Name',&Amount); / / / / -- Borrower: enter 5 rows (INSERT once + 4 x /) INSERT INTO Borrower VALUES ('&Customer_Name','&Loan_Number'); / / / / -- 3. Customers with at least two accounts at the Main branch SELECT d.Customer_Name FROM Depositor d JOIN Account a ON a.Acc_No = d.Acc_No WHERE a.Branch_Name = 'Main' GROUP BY d.Customer_Name HAVING COUNT(*) >= 2; -- 4. Customers with an account at ALL branches of a city SELECT d.Customer_Name FROM Depositor d JOIN Account a ON a.Acc_No = d.Acc_No Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 7 JOIN Branch b ON b.Branch_Name = a.Branch_Name WHERE b.Branch_City = 'Chennai' -- change the city GROUP BY d.Customer_Name HAVING COUNT( DISTINCT b.Branch_Name) = ( SELECT COUNT(*) FROM Branch WHERE Branch_City = 'Chennai'); -- 5. PL/SQL: sum and average of three numbers SET SERVEROUTPUT ON DECLARE a NUMBER := 10; b NUMBER := 20; c NUMBER := 30; BEGIN DBMS_OUTPUT.PUT_LINE('Sum = ' || (a + b + c)); DBMS_OUTPUT.PUT_LINE('Average = ' || (a + b + c) / 3); END ; / Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 8 Question 5 - Hostel Management System Question 5 - Hostel Management System Key idea: COUNT + GROUP BY counts per group. LEFT JOIN shows groups with zero (hostels with no warden). CREATE TABLE Hostel ( Hno NUMBER PRIMARY KEY , Hname VARCHAR2(20), Type VARCHAR2(5) CHECK (Type IN ('Boys', 'Girls'))); CREATE TABLE Menu ( Hno NUMBER REFERENCES Hostel(Hno), Day VARCHAR2(10), Breakfast VARCHAR2(30), Lunch VARCHAR2(30), Dinner VARCHAR2(30), PRIMARY KEY (Hno, Day)); CREATE TABLE Warden ( Wname VARCHAR2(30) PRIMARY KEY , Qual VARCHAR2(20), Hno NUMBER REFERENCES Hostel(Hno)); CREATE TABLE Student_5 ( Sid NUMBER PRIMARY KEY , Sname VARCHAR2(30), Gender VARCHAR2(6), Year NUMBER(1), Hno NUMBER REFERENCES Hostel(Hno)); -- Hostel: enter 5 rows (INSERT once + 4 x /) INSERT INTO Hostel VALUES (&Hno,'&Hname','&Type'); / / / / -- Menu: enter 5 rows (INSERT once + 4 x /) INSERT INTO Menu VALUES (&Hno,'&Day','&Breakfast','&Lunch','&Dinner'); / / / / -- Warden: enter 5 rows (INSERT once + 4 x /) INSERT INTO Warden VALUES ('&Wname','&Qual',&Hno); / / / / -- Student_5: enter 5 rows (INSERT once + 4 x /) INSERT INTO Student_5 VALUES (&Sid,'&Sname','&Gender',&Year,&Hno); / / / / -- 1. Number of girls' and boys' hostels SELECT Type, COUNT(*) AS Total_Hostels FROM Hostel GROUP BY Type; -- 2. Menu of Hostel 'X' on Tuesday SELECT m.* FROM Menu m JOIN Hostel h ON h.Hno = m.Hno WHERE h.Hname = 'X' AND m.Day = 'Tuesday'; -- 3. Number of wardens in each hostel SELECT h.Hname, COUNT(w.Wname) AS Wardens FROM Hostel h LEFT JOIN Warden w ON w.Hno = h.Hno GROUP BY h.Hname; -- 4. Student names starting with 'S' SELECT Sname FROM Student_5 WHERE Sname LIKE 'S%'; -- 5. PL/SQL: factorial SET SERVEROUTPUT ON DECLARE n NUMBER := 5; f NUMBER := 1; BEGIN FOR i IN 1..n LOOP f := f * i; END LOOP ; DBMS_OUTPUT.PUT_LINE('Factorial = ' || f); END ; / Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 9 Question 6 - Employee Management System Question 6 - Employee Management System Key idea: ROWNUM <= 5 on a sorted subquery = top 5. A row-level trigger reads the new row through :NEW. CREATE TABLE Employee_6 ( Empid NUMBER PRIMARY KEY , Empname VARCHAR2(30), Department VARCHAR2(20), Designation VARCHAR2(20), Gross_Salary NUMBER(10,2)); -- Employee_6: enter 5 rows (INSERT once + 4 x /) INSERT INTO Employee_6 VALUES (&Empid,'&Empname','&Department','&Designation',&Gross_Salary); / / / / -- 1. Five highest-paid employees SELECT * FROM ( SELECT * FROM Employee_6 ORDER BY Gross_Salary DESC ) WHERE ROWNUM <= 5; -- 2. Trigger: show the row whenever a row is inserted SET SERVEROUTPUT ON CREATE OR REPLACE TRIGGER trg_emp_insert AFTER INSERT ON Employee_6 FOR EACH ROW BEGIN DBMS_OUTPUT.PUT_LINE('Inserted: ' || :NEW.Empid || ' ' || :NEW.Empname || ' ' || :NEW.Department || ' ' || :NEW.Designation || ' ' || :NEW.Gross_Salary); END ; / -- one new row: the trigger prints it INSERT INTO Employee_6 VALUES (&Empid,'&Empname','&Department','&Designation',&Gross_Salary); Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 10 Question 7 - Employee Relational Database Question 7 - Employee Relational Database Key idea: > ALL = bigger than every value. CASE gives a conditional update. Division = NOT EXISTS inside NOT EXISTS. Note: Company's key is (Company_Name, City) because one company can be in many cities. Note: The schema has no employee number, so the function takes Employee_Name. CREATE TABLE Employee_7 (Employee_Name VARCHAR2(30) PRIMARY KEY , Street VARCHAR2(30), City VARCHAR2(20)); CREATE TABLE Works (Employee_Name VARCHAR2(30) PRIMARY KEY REFERENCES Employee_7(Employee_Name), Company_Name VARCHAR2(30), Salary NUMBER(10,2)); CREATE TABLE Company_7 (Company_Name VARCHAR2(30), City VARCHAR2(20), PRIMARY KEY (Company_Name, City)); CREATE TABLE Manages (Employee_Name VARCHAR2(30) PRIMARY KEY REFERENCES Employee_7(Employee_Name), Manager_Name VARCHAR2(30) REFERENCES Employee_7(Employee_Name)); -- Employee_7: enter 5 rows (INSERT once + 4 x /) INSERT INTO Employee_7 VALUES ('&Employee_Name','&Street','&City'); / / / / -- Works: enter 5 rows (INSERT once + 4 x /) INSERT INTO Works VALUES ('&Employee_Name','&Company_Name',&Salary); / / / / -- Company_7: enter 5 rows (INSERT once + 4 x /) INSERT INTO Company_7 VALUES ('&Company_Name','&City'); / / / / -- Manages: enter 5 rows (INSERT once + 4 x /) INSERT INTO Manages VALUES ('&Employee_Name','&Manager_Name'); / / / / -- 1. Earn more than every employee of Small Bank Corporation SELECT Employee_Name FROM Works WHERE Salary > ALL ( SELECT Salary FROM Works WHERE Company_Name = 'Small Bank Corporation'); -- 2. Companies located in every city of Small Bank Corporation SELECT DISTINCT c.Company_Name FROM Company_7 c WHERE NOT EXISTS ( SELECT s.City FROM Company_7 s WHERE s.Company_Name = 'Small Bank Corporation' AND NOT EXISTS ( SELECT 1 FROM Company_7 x WHERE x.Company_Name = c.Company_Name AND x.City = s.City)); -- 3. First Bank managers: 10% raise, but only 3% if the result exceeds 100000 UPDATE Works SET Salary = CASE WHEN Salary * 1.10 > 100000 THEN Salary * 1.03 ELSE Salary * 1.10 END WHERE Company_Name = 'First Bank Corporation' AND Employee_Name IN ( SELECT Manager_Name FROM Manages); -- 4. Names starting with 'J' SELECT Employee_Name FROM Employee_7 WHERE Employee_Name LIKE 'J%'; -- 5. Function with exception handling SET SERVEROUTPUT ON CREATE OR REPLACE FUNCTION Show_Employee (p_name VARCHAR2) RETURN VARCHAR2 IS v_text VARCHAR2(200); BEGIN SELECT e.Employee_Name || ', ' || e.City || ', ' || w.Company_Name || ', ' || w.Salary INTO v_text FROM Employee_7 e JOIN Works w ON w.Employee_Name = e.Employee_Name WHERE e.Employee_Name = p_name; RETURN v_text; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN 'Employee not found'; WHEN OTHERS THEN RETURN 'Error: ' || SQLERRM; END ; / BEGIN DBMS_OUTPUT.PUT_LINE(Show_Employee('John')); END ; / Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 11 Question 8 - Salesman and Customer Database Question 8 - Salesman and Customer Database Key idea: A view is a saved SELECT. Store commission as a fraction (0.15 = 15%). CREATE TABLE Salesman ( Salesman_ID NUMBER PRIMARY KEY , Name VARCHAR2(30), City VARCHAR2(20), Commission NUMBER(4,2)); CREATE TABLE Customer_8 ( Customer_ID NUMBER PRIMARY KEY , Name VARCHAR2(30), City VARCHAR2(20), Grade NUMBER, Salesman_ID NUMBER REFERENCES Salesman(Salesman_ID)); -- Salesman: enter 5 rows (INSERT once + 4 x /) INSERT INTO Salesman VALUES (&Salesman_ID,'&Name','&City',&Commission); / / / / -- Customer_8: enter 5 rows (INSERT once + 4 x /) INSERT INTO Customer_8 VALUES (&Customer_ID,'&Name','&City',&Grade,&Salesman_ID); / / / / -- 1. View: New York salesmen CREATE OR REPLACE VIEW NY_Salesmen AS SELECT * FROM Salesman WHERE City = 'New York'; -- 2. View: Salesman_ID, Name, City CREATE OR REPLACE VIEW Salesman_Basic AS SELECT Salesman_ID, Name, City FROM Salesman; -- 3. New York salesmen with commission above 13% SELECT * FROM Salesman WHERE City = 'New York' AND Commission > 0.13; -- 4. View: number of customers at each grade CREATE OR REPLACE VIEW Grade_Count AS SELECT Grade, COUNT(*) AS Customers FROM Customer_8 GROUP BY Grade; -- 5. PL/SQL: simple interest = P * R * T / 100 SET SERVEROUTPUT ON DECLARE p NUMBER := 10000; r NUMBER := 5; t NUMBER := 2; BEGIN DBMS_OUTPUT.PUT_LINE('Simple Interest = ' || p * r * t / 100); END ; / Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 12 Question 9 - Book Management System Question 9 - Book Management System Key idea: COMMIT makes work permanent. ROLLBACK TO <savepoint> undoes only what came after it. CREATE TABLE Book ( Sl_No NUMBER PRIMARY KEY , Book_Name VARCHAR2(50), Author_Name VARCHAR2(30), Price NUMBER(8,2), Edition NUMBER(2), Publisher_Name VARCHAR2(30)); -- 1. rows 1 to 3 -- Book: enter 3 rows (INSERT once + 2 x /) INSERT INTO Book VALUES (&Sl_No,'&Book_Name','&Author_Name',&Price,&Edition,'&Publisher_Name'); / / COMMIT ; -- 2. commit SAVEPOINT B; -- 3. savepoint named B -- Book: enter 2 rows (INSERT once + 1 x /) INSERT INTO Book VALUES (&Sl_No,'&Book_Name','&Author_Name',&Price,&Edition,'&Publisher_Name'); / ROLLBACK TO B; -- 4. rows 4 and 5 are removed -- Book: enter 7 rows (INSERT once + 6 x /) INSERT INTO Book VALUES (&Sl_No,'&Book_Name','&Author_Name',&Price,&Edition,'&Publisher_Name'); / / / / / / COMMIT ; -- 5. GRANT and REVOKE (PUBLIC = every user; or use a real user name) GRANT SELECT , INSERT ON Book TO PUBLIC ; REVOKE SELECT , INSERT ON Book FROM PUBLIC ; -- 6. View CREATE OR REPLACE VIEW Book_View AS SELECT Sl_No, Book_Name, Price FROM Book; Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 13 Question 10 - Loan Database Question 10 - Loan Database Key idea: Same queries as Question 3; the new part is a PL/SQL block that reads one row into variables. CREATE TABLE Customer_10 ( Customer_ID NUMBER PRIMARY KEY , Customer_Name VARCHAR2(30), Age NUMBER(3), Phone_No VARCHAR2(15)); CREATE TABLE Loan_10 ( Loan_ID VARCHAR2(10) PRIMARY KEY , Amount NUMBER(12,2), Customer_ID NUMBER REFERENCES Customer_10(Customer_ID), CONSTRAINT chk_loan10 CHECK (Loan_ID LIKE 'L%')); -- 1. must start with L -- Customer_10: enter 5 rows (INSERT once + 4 x /) INSERT INTO Customer_10 VALUES (&Customer_ID,'&Customer_Name',&Age,'&Phone_No'); / / / / -- Loan_10: enter 5 rows (INSERT once + 4 x /) INSERT INTO Loan_10 VALUES ('&Loan_ID',&Amount,&Customer_ID); / / / / -- 2. Total loan amount per customer SELECT Customer_ID, SUM(Amount) AS Total_Loan FROM Loan_10 GROUP BY Customer_ID; -- 3. Customers with less than two loans SELECT c.Customer_ID, c.Customer_Name FROM Customer_10 c LEFT JOIN Loan_10 l ON l.Customer_ID = c.Customer_ID GROUP BY c.Customer_ID, c.Customer_Name HAVING COUNT(l.Loan_ID) < 2; -- 4. PL/SQL: details of a given customer SET SERVEROUTPUT ON DECLARE v_id NUMBER := 1; -- input Customer ID v_name Customer_10.Customer_Name%TYPE; v_age Customer_10.Age%TYPE; v_phone Customer_10.Phone_No%TYPE; BEGIN SELECT Customer_Name, Age, Phone_No INTO v_name, v_age, v_phone FROM Customer_10 WHERE Customer_ID = v_id; DBMS_OUTPUT.PUT_LINE(v_id || ' ' || v_name || ' ' || v_age || ' ' || v_phone); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Customer not found'); END ; / Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 14 Question 11 - Student and Mark Details Question 11 - Student and Mark Details Key idea: ALTER ... ADD / DROP COLUMN changes structure. MONTHS_BETWEEN(date1, date2) gives months. CREATE TABLE Stu_Details ( Reg_No NUMBER PRIMARY KEY , Stu_Name VARCHAR2(30), DOB DATE, Address VARCHAR2(50), City VARCHAR2(20)); CREATE TABLE Mark_Details_11 ( Reg_No NUMBER REFERENCES Stu_Details(Reg_No), Mark1 NUMBER, Mark2 NUMBER, Mark3 NUMBER, Total NUMBER); -- Stu_Details: enter 5 rows (INSERT once + 4 x /) INSERT INTO Stu_Details VALUES (&Reg_No,'&Stu_Name',TO_DATE('&DOB','DD-MM-YYYY'),'&Address','&City'); / / / / -- Mark_Details_11: enter 5 rows (INSERT once + 4 x /) INSERT INTO Mark_Details_11 VALUES (&Reg_No,&Mark1,&Mark2,&Mark3,&Total); / / / / -- 1. Add the column Average ALTER TABLE Mark_Details_11 ADD Average NUMBER(5,2); -- 2. Months between DOB and today SELECT Reg_No, Stu_Name, TRUNC(MONTHS_BETWEEN(SYSDATE, DOB)) AS Months FROM Stu_Details; -- 3. Drop the Address column ALTER TABLE Stu_Details DROP COLUMN Address; -- 4. PL/SQL: factorial SET SERVEROUTPUT ON DECLARE n NUMBER := 5; f NUMBER := 1; BEGIN FOR i IN 1..n LOOP f := f * i; END LOOP ; DBMS_OUTPUT.PUT_LINE('Factorial = ' || f); END ; / Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 15 Question 12 - Employee and Department Database Question 12 - Employee and Department Database Key idea: TRUNC(MONTHS_BETWEEN(SYSDATE, DoJ) / 12) = completed years. TO_CHAR(date, 'MM') = month number. CREATE TABLE Department_12 (Dname VARCHAR2(20), Deptno NUMBER PRIMARY KEY , Dloc VARCHAR2(20)); CREATE TABLE Employee_12 ( Empno NUMBER PRIMARY KEY , Ename VARCHAR2(20), Job VARCHAR2(20), MgrId NUMBER, DoB DATE, DoJ DATE, Sal NUMBER(8,2), Comm NUMBER(8,2), Deptno NUMBER REFERENCES Department_12(Deptno)); -- Department_12: enter 5 rows (INSERT once + 4 x /) INSERT INTO Department_12 VALUES ('&Dname',&Deptno,'&Dloc'); / / / / -- Employee_12: enter 5 rows (INSERT once + 4 x /) INSERT INTO Employee_12 VALUES (&Empno,'&Ename','&Job',&MgrId, TO_DATE('&DoB','DD-MM-YYYY'),TO_DATE('&DoJ','DD-MM-YYYY'),&Sal,&Comm,&Deptno); / / / / -- 1. Empno, name, salary, experience - highest salary first SELECT Empno, Ename, Sal, TRUNC(MONTHS_BETWEEN(SYSDATE, DoJ) / 12) AS Experience_Years FROM Employee_12 ORDER BY Sal DESC ; -- 2. Employees of the Marketing department SELECT e.Ename FROM Employee_12 e JOIN Department_12 d ON d.Deptno = e.Deptno WHERE d.Dname = 'Marketing'; -- 3. Employees born in the current month SELECT Ename FROM Employee_12 WHERE TO_CHAR(DoB, 'MM') = TO_CHAR(SYSDATE, 'MM'); -- 4. PL/SQL: area of circles with 3 < radius <= 7 (that is 4, 5, 6, 7) CREATE TABLE Circle_Area (Radius NUMBER, Area NUMBER(10,2)); BEGIN FOR r IN 4..7 LOOP INSERT INTO Circle_Area VALUES (r, ROUND(3.14159 * r * r, 2)); END LOOP ; COMMIT ; END ; / SELECT * FROM Circle_Area; Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 16 Question 13 - Student Database and View Question 13 - Student Database and View Key idea: A view hides a WHERE filter behind a name. WHILE loop + MOD / TRUNC peels digits off a number. -- 1. Create and populate CREATE TABLE Student_13 (Regno NUMBER PRIMARY KEY , Name VARCHAR2(30), Dept VARCHAR2(10)); -- Student_13: enter 5 rows (INSERT once + 4 x /) INSERT INTO Student_13 VALUES (&Regno,'&Name','&Dept'); / / / / COMMIT ; -- 2. View for CSE students CREATE OR REPLACE VIEW CSE_Students AS SELECT * FROM Student_13 WHERE Dept = 'CSE'; -- 3. TCL -- Student_13: one row INSERT INTO Student_13 VALUES (&Regno,'&Name','&Dept'); SAVEPOINT s1; UPDATE Student_13 SET Dept = 'IT'; ROLLBACK TO s1; -- undoes the update only COMMIT ; -- keeps the inserted row -- 4. PL/SQL: reverse of a number SET SERVEROUTPUT ON DECLARE n NUMBER := 1234; t NUMBER; rev NUMBER := 0; BEGIN t := n; WHILE t > 0 LOOP rev := rev * 10 + MOD(t, 10); t := TRUNC(t / 10); END LOOP ; DBMS_OUTPUT.PUT_LINE('Reverse = ' || rev); END ; / Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 17 Question 14 - Timetable Generation System Question 14 - Timetable Generation System Key idea: Faculty timetable = Timetable joined with Subject_Allocated (who teaches what) on subject, year and dept. CREATE TABLE Faculty_Details (FacultyID NUMBER PRIMARY KEY , FacultyName VARCHAR2(30), Dept VARCHAR2(10)); CREATE TABLE Subject_Details (Subcode VARCHAR2(8) PRIMARY KEY , Subtitle VARCHAR2(40), Dept VARCHAR2(10), Year NUMBER(1)); CREATE TABLE Subject_Allocated ( Subcode VARCHAR2(8) REFERENCES Subject_Details(Subcode), Year NUMBER(1), Dept VARCHAR2(10), FacultyID NUMBER REFERENCES Faculty_Details(FacultyID), PRIMARY KEY (Subcode, Year, Dept)); CREATE TABLE Timetable ( Period NUMBER(2), Timefrom VARCHAR2(5), Timeto VARCHAR2(5), Subcode VARCHAR2(8) REFERENCES Subject_Details(Subcode), Year NUMBER(1), Dept VARCHAR2(10), PRIMARY KEY (Period, Year, Dept)); -- Faculty_Details: enter 5 rows (INSERT once + 4 x /) INSERT INTO Faculty_Details VALUES (&FacultyID,'&FacultyName','&Dept'); / / / / -- Subject_Details: enter 5 rows (INSERT once + 4 x /) INSERT INTO Subject_Details VALUES ('&Subcode','&Subtitle','&Dept',&Year); / / / / -- Subject_Allocated: enter 5 rows (INSERT once + 4 x /) INSERT INTO Subject_Allocated VALUES ('&Subcode',&Year,'&Dept',&FacultyID); / / / / -- Timetable: enter 5 rows (INSERT once + 4 x /) INSERT INTO Timetable VALUES (&Period,'&Timefrom','&Timeto','&Subcode',&Year,'&Dept'); / / / / -- 1. Timetable of one faculty member SELECT t.Period, t.Timefrom, t.Timeto, s.Subtitle, t.Year, t.Dept FROM Timetable t JOIN Subject_Allocated a ON a.Subcode = t.Subcode AND a.Year = t.Year AND a.Dept = t.Dept JOIN Subject_Details s ON s.Subcode = t.Subcode WHERE a.FacultyID = 1 -- change the faculty ID ORDER BY t.Year, t.Period; -- 2. Timetable of each class SELECT Dept, Year, Period, Timefrom, Timeto, Subcode FROM Timetable ORDER BY Dept, Year, Period; -- 3. Timetable of one subject SELECT * FROM Timetable WHERE Subcode = 'CS101' ORDER BY Year, Dept, Period; -- change the code -- 4. PL/SQL: Fibonacci series (10 terms) SET SERVEROUTPUT ON DECLARE a NUMBER := 0; b NUMBER := 1; c NUMBER; s VARCHAR2(200); BEGIN FOR i IN 1..10 LOOP s := s || a || ' '; c := a + b; a := b; b := c; END LOOP ; DBMS_OUTPUT.PUT_LINE(s); END ; / Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 18 Question 15 - IoT Simulator Question 15 - IoT Simulator Key idea: Two time ranges overlap when start1 <= end2 AND end1 >= start2. DATE minus DATE = days. CREATE TABLE Device_Details (DeviceID NUMBER PRIMARY KEY , DeviceName VARCHAR2(30), Properties VARCHAR2(60)); CREATE TABLE Connect_Status (DeviceID NUMBER REFERENCES Device_Details(DeviceID), LoginTime DATE, LogoutTime DATE); CREATE TABLE Transaction_Details ( TransID NUMBER PRIMARY KEY , DeviceID NUMBER REFERENCES Device_Details(DeviceID), UpdatedProperties VARCHAR2(60), TimeofUpdation DATE); -- Device_Details: enter 5 rows (INSERT once + 4 x /) INSERT INTO Device_Details VALUES (&DeviceID,'&DeviceName','&Properties'); / / / / -- Connect_Status: enter 5 rows (INSERT once + 4 x /) INSERT INTO Connect_Status VALUES (&DeviceID,TO_DATE('&LoginTime','DD-MM-YYYY HH24:MI'),TO_DATE('&LogoutTime','DD-MM-YYYY HH24:MI')); / / / / -- Transaction_Details: enter 5 rows (INSERT once + 4 x /) INSERT INTO Transaction_Details VALUES (&TransID,&DeviceID,'&UpdatedProperties',TO_DATE('&TimeofUpdation','DD-MM-YYYY HH24:MI')); / / / / -- 1. Devices connected during a session (change the two times) SELECT d.DeviceID, d.DeviceName, d.Properties, c.LoginTime, c.LogoutTime FROM Device_Details d JOIN Connect_Status c ON c.DeviceID = d.DeviceID WHERE c.LoginTime <= TO_DATE('2026-11-01 12:00', 'YYYY-MM-DD HH24:MI') AND c.LogoutTime >= TO_DATE('2026-11-01 09:00', 'YYYY-MM-DD HH24:MI'); -- 2. Device and property active for the longest time SELECT d.DeviceID, d.DeviceName, d.Properties FROM Device_Details d JOIN Connect_Status c ON c.DeviceID = d.DeviceID WHERE (c.LogoutTime - c.LoginTime) = ( SELECT MAX(LogoutTime - LoginTime) FROM Connect_Status); -- 3. PL/SQL: greatest of three numbers SET SERVEROUTPUT ON DECLARE a NUMBER := 25; b NUMBER := 87; c NUMBER := 56; BEGIN DBMS_OUTPUT.PUT_LINE('Greatest = ' || GREATEST(a, b, c)); END ; / Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 19 Question 16 - Student Course Enrollment Question 16 - Student Course Enrollment Key idea: Subquery with MAX = 'the highest'. Youngest = latest birth date, so MAX(Bdate). CREATE TABLE Student_16 (Regno NUMBER PRIMARY KEY , Name VARCHAR2(30), Major VARCHAR2(10), Bdate DATE); CREATE TABLE Course (Courseno VARCHAR2(6) PRIMARY KEY , Cname VARCHAR2(30), Dept VARCHAR2(10)); CREATE TABLE Enroll ( Regno NUMBER REFERENCES Student_16(Regno), Courseno VARCHAR2(6) REFERENCES Course(Courseno), Sem NUMBER(1), Marks NUMBER(5,2), PRIMARY KEY (Regno, Courseno, Sem)); -- Student_16: enter 5 rows (INSERT once + 4 x /) INSERT INTO Student_16 VALUES (&Regno,'&Name','&Major',TO_DATE('&Bdate','DD-MM-YYYY')); / / / / -- Course: enter 5 rows (INSERT once + 4 x /) INSERT INTO Course VALUES ('&Courseno','&Cname','&Dept'); / / / / -- Enroll: enter 5 rows (INSERT once + 4 x /) INSERT INTO Enroll VALUES (&Regno,'&Courseno',&Sem,&Marks); / / / / -- 1. Students registered for more than two courses in a department SELECT COUNT(*) AS Total_Students FROM ( SELECT e.Regno FROM Enroll e JOIN Course c ON c.Courseno = e.Courseno WHERE c.Dept = 'CSE' -- change the department GROUP BY e.Regno HAVING COUNT( DISTINCT e.Courseno) > 2); -- 2. Highest mark in each course SELECT c.Cname, s.Name, e.Marks FROM Enroll e JOIN Student_16 s ON s.Regno = e.Regno JOIN Course c ON c.Courseno = e.Courseno WHERE e.Marks = ( SELECT MAX(Marks) FROM Enroll WHERE Courseno = e.Courseno); -- 3. Youngest student of each course SELECT DISTINCT c.Dept, c.Cname, s.Name, s.Bdate FROM Course c JOIN Enroll e ON e.Courseno = c.Courseno JOIN Student_16 s ON s.Regno = e.Regno WHERE s.Bdate = ( SELECT MAX(s2.Bdate) FROM Student_16 s2 JOIN Enroll e2 ON e2.Regno = s2.Regno WHERE e2.Courseno = c.Courseno); -- 4. PL/SQL: sum of digits SET SERVEROUTPUT ON DECLARE n NUMBER := 4521; t NUMBER; total NUMBER := 0; BEGIN t := n; WHILE t > 0 LOOP total := total + MOD(t, 10); t := TRUNC(t / 10); END LOOP ; DBMS_OUTPUT.PUT_LINE('Sum of digits = ' || total); END ; / Database Management Systems Laboratory - Batch 1 | Practical Examination Answers Page 20 Question 17 - Customer Loan Management System Question 17 - Customer Loan Management System Key idea: Sum each loan table in its own subquery, otherwise joining both tables double-counts amounts. CREATE TABLE Customer_17 ( Custid NUMBER PRIMARY KEY , Custname VARCHAR2(30), Phone_Number VARCHAR2(15), PAN VARCHAR2(10) UNIQUE , DOB DATE); CREATE TABLE HomeLoan ( HLoanid NUMBER PRIMARY KEY , Amount NUMBER(12,2), Custid NUMBER REFERENCES Customer_17(Custid)); CREATE TABLE VehicleLoan ( VLoanid NUMBER PRIMARY KEY , Amount NUMBER(12,2), Custid NUMBER REFERENCES Customer_17(Custid)); -- Customer_17: enter 5 rows (INSERT once + 4 x /) INSERT INTO Customer_17 VALUES (&Custid,'&Custname','&Phone_Number','&PAN',TO_DATE('&DOB','DD-MM-YYYY')); / / / / -- HomeLoan: enter 5 rows (INSERT once + 4 x /) INSERT INTO HomeLoan VALUES (&HLoanid,&Amount,&Custid); / / / / -- VehicleLoan: enter 5 rows (INSERT once + 4 x /) INSERT INTO VehicleLoan VALUES (&VLoanid,&Amount,&Custid); / / / / -- 1. Display all tables SELECT * FROM Customer_17; SELECT * FROM HomeLoan; SELECT * FROM VehicleLoan; -- 2. View with total loan amount per customer CREATE OR REPLACE VIEW Customer_Loan_View AS SELECT c.Custid AS Customer_ID, c.Custname AS Customer_Name, NVL(( SELECT SUM(Amount) FROM HomeLoan WHERE Custid = c.Custid), 0) + NVL(( SELECT SUM(Amount) FROM VehicleLoan WHERE Custid = c.Custid), 0) AS Total_Loan_Amount FROM Customer_17 c; -- 3. Trigger: show Home Loan details on every insert SET SERVEROUTPUT ON CREATE OR REPLACE TRIGGER trg_homeloan AFTER INSERT ON HomeLoan FOR EACH ROW BEGIN DBMS_OUTPUT.PUT_LINE('Home Loan ' || :NEW.HLoanid || ', Amount ' || :NEW.Amount || ', Customer ' || :NEW.Custid); END ; / -- one new row: the trigger prints it INSERT INTO HomeLoan VALUES (&HLoanid,&Amount,&Custid);