Added content.

- Notes
- Practical (Databases, Handouts, Queries, Softcopies, Write-ups)
- Question Papers
- DISCLAIMER file and motto
Lastly, updated README file.
This commit is contained in:
K
2025-01-07 16:34:41 +05:30
parent 375dc7e391
commit 3049887277
97 changed files with 5262 additions and 0 deletions
@@ -0,0 +1,32 @@
# P1 - PL-SQL code
**Problem Statement:** Write a PL/SQL code block to calculate the area of a circle for a value of radius varying from 5 to 9. Store the radius and the corresponding values of calculated area in an empty table named areas, consisting of two columns, radius and area.
---
## Procedure
```plsql
DECLARE
radius NUMBER;
area NUMBER;
nodata EXCEPTION;
BEGIN
DBMS_OUTPUT.PUT_LINE('Enter radius: ');
radius := &radius; -- for Live SQL, specify a value. Eg. radius := 5;
IF NOT (radius BETWEEN 5 AND 9) THEN
raise nodata;
END IF;
area := 3.14 * radius * radius;
DBMS_OUTPUT.PUT_LINE('Area of circle with radius ' || radius || ' cm is ' || area || ' sq.cm.');
EXCEPTION
WHEN nodata THEN
DBMS_OUTPUT.PUT_LINE('Radius should be between 5 and 9.');
END;
/
```
---
@@ -0,0 +1,87 @@
# P10 - Trigger
**Problem Statement:** Trigger: Write a after trigger for Insert, update and delete event considering following requirement:
Emp(Emp_no, Emp_name, Emp_salary)
a) Trigger should be initiated when salary tried to be inserted is less than Rs.50,000/-
b) Trigger should be initiated when salary tried to be updated for value less than Rs. 50,000/-
Also the new values expected to be inserted will be stored in new table Tracking(Emp_no,Emp_salary).
---
## Creating tables:
```sql
CREATE TABLE Emp(
Emp_no NUMBER(14),
Emp_name VARCHAR(255),
Emp_salary NUMBER(14)
);
CREATE TABLE Tracking(
Emp_no NUMBER(14),
Emp_salary NUMBER(14)
);
```
## Trigger
```sql
CREATE OR REPLACE TRIGGER P10
AFTER INSERT OR UPDATE ON Emp
FOR EACH ROW
BEGIN
IF inserting THEN
IF (:New.Emp_salary < 50000) THEN
insert into Tracking (Emp_no, Emp_salary) VALUES (:New.Emp_no, :New.Emp_salary);
DBMS_OUTPUT.PUT_LINE('Inserting record with salary < 50000');
END IF;
ELSIF updating THEN
IF (:New.Emp_salary < 50000) THEN
UPDATE Tracking SET Emp_salary = :New.Emp_salary WHERE Emp_no = :Old.Emp_no;
DBMS_OUTPUT.PUT_LINE('Updated value of salary < 50000 for a record');
END IF;
END IF;
END;
/
```
1. After performing insertion operation:
```sql
INSERT INTO Emp VALUES (1, 'Tanmay', 45000);
INSERT INTO Emp VALUES (2, 'Rajesh', 35000);
```
<details>
<summary>Output</summary>
1 row(s) inserted.<br>
Inserting record with salary < 50000<br>
<br>
1 row(s) inserted.<br>
Inserting record with salary < 50000<br>
<br>
Tracking:<br>
EMP_NO EMP_SALARY<br>
1 45000<br>
2 35000<br>
</details>
2. After performing update operation:
```sql
UPDATE Emp SET Emp_salary = 43000 WHERE Emp_no = 1;
```
<details>
<summary>Output</summary>
1 row(s) updated.<br>
Updated value of salary < 50000 for a record<br>
<br>
Tracking:<br>
EMP_NO EMP_SALARY<br>
1 43000<br>
2 35000<br>
</details>
---
@@ -0,0 +1,102 @@
# P2 - Unamed PL-SQL
**Problem Statement:**
Write an Unnamed PL/SQL of code for the following requirements: -
Schema:
Borrower (Rollin, Name, DateofIssue, NameofBook, Status)
Fine (Roll_no,Date,Amt)
Accept roll_no & name of book from user.
Check the number of days (from date of issue).
1. If days are between 15 to 30 then fine amounts will be Rs 5 per
day.
2. If no. of days>30, per day fine will be Rs 50 per day & for days
less than 30, Rs. 5 per day.
3. After submitting the book, status will change from I to R.
4. If condition of fine is true, then details will be stored into
fine table.
---
## Creating tables
```plsql
CREATE TABLE Borrower (
rollin NUMBER,
Name VARCHAR2(255),
DateofIssue DATE,
NameofBook VARCHAR2(255),
Status VARCHAR2(255),
PRIMARY KEY (rollin)
);
CREATE TABLE Fine (
Roll_no NUMBER,
DateofReturn DATE,
Amt NUMBER,
FOREIGN KEY (Roll_no) REFERENCES Borrower (rollin)
);
```
> [!WARNING]
> Notice inconsistent naming for columns? We're just doing it by the books. Blame the one who made these [problem statements](https://git.kska.io/sppu-te-comp-content/DatabaseManagementSystems/src/branch/main/Practical/Practical%20Exam/DBMSL%20-%20Problem%20Statements%20for%20Practical%20Exam%20%28November%202024%29.pdf).
## Inserting data
```plsql
INSERT INTO Borrower VALUES (1, 'Kalas', TO_DATE('2024-10-19', 'YYYY-MM-DD'), 'DBMS', 'I');
INSERT INTO Borrower VALUES (2, 'Himanshu', TO_DATE('2024-11-01', 'YYYY-MM-DD'), 'IOT', 'I');
INSERT INTO Borrower VALUES (3, 'Mepa', TO_DATE('2024-10-29', 'YYYY-MM-DD'), 'TOC', 'I');
INSERT INTO Borrower VALUES (4, 'Jambo', TO_DATE('2024-10-20', 'YYYY-MM-DD'), 'CNS', 'I');
```
## Procedure
```plsql
DECLARE
p_roll NUMBER;
p_book VARCHAR2(255);
p_issueDate DATE;
totalDays INT;
fineAmt INT;
nodata EXCEPTION;
BEGIN
DBMS_OUTPUT.PUT_LINE('Enter roll number: ');
p_roll := &p_roll; -- specify value directly for Live SQL. Eg.: p_roll := 1;
DBMS_OUTPUT.PUT_LINE('Enter book name: ');
p_book := '&p_book'; -- specify value directly for Live SQL. Eg.: p_roll := 'DBMS';
IF (p_roll <= 0) THEN
RAISE nodata;
END IF;
SELECT DateofIssue INTO p_issueDate FROM Borrower WHERE rollin = p_roll AND NameofBook = p_book;
SELECT TRUNC(SYSDATE) - p_issueDate INTO totalDays FROM dual;
IF (totalDays > 30) THEN
fineAmt := (15 * 5) + ((totalDays - 15) * 50); -- Rs 5 for first 15 days, Rs 50 for remaining
DBMS_OUTPUT.PUT_LINE('Roll no. ' || p_roll || ' has been fined Rs. ' || fineAmt);
INSERT INTO Fine VALUES (p_roll, SYSDATE, fineAmt);
UPDATE Borrower SET Status = 'R' WHERE Rollin = p_roll AND NameofBook = p_book;
ELSIF (totalDays BETWEEN 15 AND 30) THEN
fineAmt := totalDays * 5;
DBMS_OUTPUT.PUT_LINE('Roll no. '|| p_roll || ' has been fined Rs. ' || fineAmt);
INSERT INTO Fine VALUES (p_roll, SYSDATE, fineAmt);
UPDATE Borrower SET Status = 'R' WHERE Rollin = p_roll AND NameofBook = p_book;
ELSE
fineAmt := 0;
DBMS_OUTPUT.PUT_LINE('No fine for roll no. '|| p_roll);
INSERT INTO Fine VALUES (p_roll, SYSDATE, fineAmt);
UPDATE Borrower SET Status = 'R' WHERE Rollin = p_roll AND NameofBook = p_book;
END IF;
EXCEPTION
WHEN nodata THEN
DBMS_OUTPUT.PUT_LINE('Please enter a valid roll number.');
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Something went wrong. Please check input data.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error occured. Error: ' || SQLERRM);
END;
/
```
---
@@ -0,0 +1,58 @@
# P3 - Cursor
**Problem Statement:** Write a PL/SQL block of code using Cursor that will merge the data available in the newly created table N_Roll Call with the data available in the table O_RollCall. If the data in the first table already exist in the second table, then that data should be skipped.
---
## Creating tables
```plsql
CREATE TABLE O_RollCall (
roll NUMBER NOT NULL,
name VARCHAR2(255),
class VARCHAR2(255)
);
CREATE TABLE N_RollCall (
roll NUMBER NOT NULL,
name VARCHAR2(255),
class VARCHAR2(255)
);
```
## Inserting values
```plsql
INSERT INTO O_RollCall VALUES (2, 'Eddie', 'COMP-2');
INSERT INTO O_RollCall VALUES (3, 'Foxy', 'COMP-1');
INSERT INTO O_RollCall VALUES (5, 'Stomp', 'COMP-3');
INSERT INTO N_RollCall VALUES (1, 'Stewie', 'COMP-1');
INSERT INTO N_RollCall VALUES (2, 'Eddie', 'COMP-2');
INSERT INTO N_RollCall VALUES (3, 'Foxy', 'COMP-1');
INSERT INTO N_RollCall VALUES (4, 'Lara', 'COMP-3');
INSERT INTO N_RollCall VALUES (5, 'Stomp', 'COMP-3');
```
## Procedure
```plsql
DECLARE
p_roll NUMBER;
p_name VARCHAR2(255);
p_class VARCHAR2(255);
CURSOR c1 IS SELECT * FROM N_RollCall WHERE roll NOT IN (SELECT roll FROM O_RollCall);
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO p_roll, p_name, p_class;
INSERT INTO O_RollCall VALUES (p_roll, p_name, p_class);
EXIT WHEN c1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Inserted ' || p_name || ' having roll no. ' || p_roll || ' in class ' || p_class || '.');
END LOOP;
CLOSE c1;
END;
/
```
---
@@ -0,0 +1,74 @@
# P4 - PL/SQL block
**Problem Statement:** Write a PL/SQL block for following requirements and handle the exceptions. Roll no. of students will be entered by the user. Attendance of roll no. entered by user will be checked in the Stud table. If attendance is less than 75% then display the message “Term not granted” and set the status in stud table as “Detained”. Otherwise display message “Term granted” and set the status in stud table as “Not Detained”. Student (Roll, Name, Attendance, Status)
---
## Creating table
```sql
CREATE TABLE Student(
Roll NUMBER(14),
Name VARCHAR(255),
Attendance NUMBER(14),
Status VARCHAR(255)
);
```
## Inserting data
```sql
INSERT INTO Student VALUES (1, 'Tanmay', 76, NULL);
INSERT INTO Student VALUES (2, 'Rajesh', 80, NULL);
INSERT INTO Student VALUES (3, 'Tejas', 88, NULL);
INSERT INTO Student VALUES (4, 'Machkar', 35, NULL);
INSERT INTO Student VALUES (5, 'Jayashree', 74, NULL);
```
## Procedure
```sql
DECLARE
p_att Student.Attendance%type;
p_roll Student.Roll%type;
nodata EXCEPTION;
BEGIN
p_roll := &p_roll; -- specify value directly for Live SQL. Eg.: p_roll := 1;
IF (p_roll < 0) THEN
raise nodata;
END IF;
SELECT Attendance INTO p_att FROM Student WHERE Roll = p_roll;
IF (p_att < 75) THEN
DBMS_OUTPUT.PUT_LINE('Term not granted to roll no. ' || p_roll);
UPDATE Student SET Status = 'Detained' WHERE Roll = p_roll;
ELSIF (p_att >= 75) THEN
DBMS_OUTPUT.PUT_LINE('Term granted to roll no. ' || p_roll);
UPDATE Student SET Status = 'Not Detained' WHERE Roll = p_roll;
END IF;
EXCEPTION
WHEN nodata THEN
DBMS_OUTPUT.PUT_LINE('Please enter a valid roll number.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error occured. Error: ' || SQLERRM);
END;
/
```
<details>
<summary>Output</summary>
After entering every Roll no:
ROLL NAME ATTENDANCE STATUS<br>
1 Tanmay 76 Not Detained<br>
2 Rajesh 80 Not Detained<br>
3 Tejas 88 Not Detained<br>
4 Machkar 35 Detained<br>
5 Jayashree 74 Detained<br>
</details>
---
@@ -0,0 +1,68 @@
# P5 - PL-SQL Block
**Problem Statement:** Write a PL/SQL Block to increase the salary of employees by 10% of existing salary, who are having salary less than average salary of organization, whenever such salary updates take place, a record for same is maintained in the increment_salary table.
emp(emp_no, salary)
increment_salary(emp_no, salary)
---
## Creating tables:
```sql
CREATE TABLE emp(
emp_no NUMBER(14),
salary NUMBER(14)
);
CREATE table increment_salary(
emp_no NUMBER(14),
salary NUMBER(14)
);
```
## Inserting values:
```sql
INSERT INTO emp VALUES (1, 1000);
INSERT INTO emp VALUES (2, 8000);
INSERT INTO emp VALUES (3, 2000);
INSERT INTO emp VALUES (4, 5000);
INSERT INTO emp VALUES (5, 7000);
```
## Procedure
```sql
DECLARE
avg_salary NUMBER(14, 4);
BEGIN
SELECT AVG(salary) INTO avg_salary FROM emp;
FOR emp_record IN (select emp_no, salary FROM emp WHERE salary < avg_salary)
LOOP
insert into increment_salary(emp_no, salary) values (emp_record.emp_no, emp_record.salary);
UPDATE emp SET salary = emp_record.salary * 1.10 WHERE emp_no = emp_record.emp_no;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
end;
/
```
<details>
<summary><strong>OUTPUT</strong>: After PL/SQL Block:</summary>
emp:<br>
EMP_NO SALARY<br>
1 1100<br>
2 8000<br>
3 2200<br>
4 5000<br>
5 7000<br>
<br>
increment_emp:<br>
EMP_NO SALARY<br>
1 1000<br>
3 2000<br>
</details>
---
@@ -0,0 +1,89 @@
# P6 - Stored Procedure
**Problem Statement:** Write a Stored Procedure namely proc_Grade for the categorization of student. If marks scored by students in examination is <=1500 and marks>=990 then student will be placed in distinction category if marks scored are between 989 and 900 categories is first class, if marks 899 and 825 category is Higher Second Class. Write a PL/SQL block for using procedure created with above requirement.
Stud_Marks(name, total_marks),
Result (Roll,Name, Class)
---
## Creating tables
```plsql
CREATE TABLE Stud_Marks (
name VARCHAR2(255),
total_marks NUMBER,
PRIMARY KEY (name)
);
CREATE TABLE Result (
Roll NUMBER NOT NULL UNIQUE,
Name VARCHAR2(255),
Class VARCHAR2(255),
FOREIGN KEY (Name) REFERENCES Stud_Marks (name)
);
```
## Inserting values
```plsql
INSERT INTO Stud_Marks VALUES ('Kalas', 1300);
INSERT INTO Stud_Marks VALUES ('Himanshu', 800);
INSERT INTO Stud_Marks VALUES ('Mehul', 950);
INSERT INTO Stud_Marks VALUES ('Gundeti', 875);
```
## Procedure
```plsql
CREATE OR REPLACE PROCEDURE proc_Grade (p_roll IN NUMBER, p_name IN VARCHAR2) IS
-- declare section
marks NUMBER;
nodata EXCEPTION;
BEGIN
IF (p_name IS NULL) THEN
raise nodata;
END IF;
SELECT total_marks INTO marks FROM Stud_Marks WHERE name = p_name;
IF (marks >= 990 AND marks <= 1500) THEN
DBMS_OUTPUT.PUT_LINE(p_name || ' has been placed in the distinction category.');
INSERT INTO Result VALUES (p_roll, p_name, 'DISTINCTION');
ELSIF (marks BETWEEN 900 AND 989) THEN
DBMS_OUTPUT.PUT_LINE(p_name || ' has been placed in the first class category.');
INSERT INTO Result VALUES (p_roll, p_name, 'FIRST CLASS');
ELSIF (marks BETWEEN 825 AND 899) THEN
DBMS_OUTPUT.PUT_LINE(p_name || ' has been placed in the higher second class category.');
INSERT INTO Result VALUES (p_roll, p_name, 'HIGHER SECOND CLASS');
ELSE
DBMS_OUTPUT.PUT_LINE(p_name || ' has failed.');
INSERT INTO Result VALUES (p_roll, p_name, 'FAIL');
END IF;
EXCEPTION
WHEN nodata THEN
DBMS_OUTPUT.PUT_LINE('Please enter a name');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error occurred. Error: ' || SQLERRM);
END proc_Grade;
/
```
## Calling procedure
```plsql
DECLARE
p_roll NUMBER;
p_name VARCHAR2(255);
BEGIN
DBMS_OUTPUT.PUT_LINE('Enter roll number: ');
p_roll := &p_roll;
DBMS_OUTPUT.PUT_LINE('Enter name: ');
p_name := '&p_name';
proc_Grade(p_roll, p_name);
END;
/
```
---
@@ -0,0 +1,58 @@
# P7 - Age_calc function
**Problem statement:** Create a stored function titled 'Age_calc'. Accept the date of birth of a person as a parameter. Calculate the age of the person in years, months and days e.g. 3 years, 2months, 10 days. Return the age in years directly (with the help of Return statement). The months and days are to be returned indirectly in the form of OUT parameters.
## Creating function
```sql
CREATE OR REPLACE FUNCTION Age_calc(
dob IN DATE,
f_month OUT NUMBER,
f_day OUT NUMBER
)
RETURN NUMBER
IS
current_date DATE := SYSDATE;
year_diff NUMBER;
month_diff NUMBER;
day_diff NUMBER;
BEGIN
year_diff := EXTRACT(YEAR FROM current_date) - EXTRACT(YEAR FROM dob);
month_diff := EXTRACT(MONTH FROM current_date) - EXTRACT(MONTH FROM dob);
day_diff := EXTRACT(DAY FROM current_date) - EXTRACT(DAY FROM dob);
IF (day_diff < 0) THEN
month_diff := month_diff - 1;
day_diff := day_diff + EXTRACT(DAY FROM last_day(add_months(SYSDATE, -1)));
END IF;
IF (month_diff < 0) THEN
year_diff := year_diff - 1;
month_diff := month_diff + 12;
END IF;
f_month := month_diff;
f_day := day_diff;
RETURN year_diff;
END;
/
```
## Calling function
```sql
DECLARE
years NUMBER;
months NUMBER;
days NUMBER;
BEGIN
years := Age_calc(TO_DATE('2003-12-02', 'YYYY-MM-DD'), months, days);
DBMS_OUTPUT.PUT_LINE('Age: ' || years || ' Years ' || months || ' Months ' || days || ' Days.');
END;
/
```
---
@@ -0,0 +1,91 @@
# P8 - Trigger
**Problem Statement:** Write a Row Level Before and After Trigger on Library table. The System should keep track of the records that are being updated or deleted. The old value of updated or deleted records should be added in Library_Audit table.
## Creating tables
```plsql
CREATE TABLE Library(
id NUMBER(12),
title VARCHAR(255),
dateofissue DATE,
author VARCHAR(255)
);
CREATE TABLE Library_Audit(
id NUMBER(12),
title VARCHAR(255),
dateofaction DATE,
author VARCHAR(255),
status VARCHAR(255)
);
```
## Inserting values
```plsql
INSERT INTO Library VALUES (1, 'Berserk', TO_DATE('2024-07-28','YYYY-MM-DD'), 'Prashant');
INSERT INTO Library VALUES (2, 'Dark', TO_DATE('2024-07-15','YYYY-MM-DD'), 'Rajendra');
INSERT INTO Library VALUES (3, 'Hannibal', TO_DATE('2024-07-20','YYYY-MM-DD'), 'Manoj');
INSERT INTO Library VALUES (4, 'AOT', TO_DATE('2024-07-30','YYYY-MM-DD'), 'Rajesh');
INSERT INTO Library VALUES (5, 'GOT', TO_DATE('2024-07-19','YYYY-MM-DD'), 'Anil');
```
## Trigger
```sql
CREATE OR REPLACE TRIGGER library_action
AFTER INSERT OR UPDATE OR DELETE
ON Library
FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT INTO Library_Audit (id, title, dateofaction, author, status) VALUES (:NEW.id, :NEW.title, current_timestamp, :NEW.author, 'Insert');
ELSIF UPDATING THEN
INSERT INTO Library_Audit (id, title, dateofaction, author, status) VALUES (:OLD.id, :OLD.title, current_timestamp, :OLD.author, 'Update');
ELSIF DELETING THEN
INSERT INTO Library_Audit (id, title, dateofaction, author, status) VALUES (:OLD.id, :OLD.title, current_timestamp, :OLD.author, 'Delete');
END IF;
END;
/
```
## Testing trigger
### Insert operation
```sql
INSERT INTO Library VALUES (15, 'CREW', TO_DATE('2024-07-22','YYYY-MM-DD'), 'Ramesh');
INSERT INTO Library VALUES (14, 'Ninteen Eighty Four', TO_DATE('2024-07-01','YYYY-MM-DD'), 'Omkar');
SELECT * FROM Library;
SELECT * FROM Library_Audit;
```
### Update operation
```sql
UPDATE Library SET id = 6, title = 'Sherlock', author = 'Deepak' where id = 3;
UPDATE Library SET id = 7, title = 'MR. ROBOT', author = 'Varad' where id = 4;
SELECT * FROM Library;
SELECT * FROM Library_Audit;
```
### Delete operation
```sql
DELETE FROM Library WHERE id = 1;
DELETE FROM Library WHERE id = 5;
SELECT * FROM Library;
SELECT * FROM Library_Audit;
```
---
@@ -0,0 +1,93 @@
# P9 - Trigger
**Problem Statement:** Trigger: Create a row level trigger for the CUSTOMERS table that would fire INSERT or UPDATE or DELETE operations performed on the CUSTOMERS table. This trigger will display the salary difference between the old values and new values.
---
## Creating table:
```sql
CREATE TABLE Customers(
name VARCHAR(255),
id NUMBER(14),
salary NUMBER(14)
);
```
## Procedure
```sql
CREATE OR REPLACE TRIGGER P
AFTER INSERT OR UPDATE OR DELETE ON Customers
FOR EACH ROW
DECLARE
diff NUMBER(14);
BEGIN
IF INSERTING THEN
DBMS_OUTPUT.PUT_LINE('New salary with value inserted: ' || :NEW.salary);
ELSIF UPDATING THEN
if :New.salary > :old.salary then diff := :New.salary - :Old.salary;
elsif :New.salary < :old.salary then diff := :Old.salary - :New.salary;
end if;
DBMS_OUTPUT.PUT_LINE('Salary difference: ' || diff);
ELSIF DELETING THEN
DBMS_OUTPUT.PUT_LINE('Salary with value deleted: ' || :OLD.salary);
END IF;
END;
/
```
## Queries
1. Insert operation:
```sql
INSERT INTO Customers VALUES ('Tanmay', 1, 20000);
INSERT INTO Customers VALUES ('Rajesh', 2, 30000);
```
<details>
<summary>Output</summary>
1 row(s) inserted.<br>
New salary with value inserted: 20000<br>
1 row(s) inserted.<br>
New salary with value inserted: 30000<br>
</details>
2. Update operation:
```sql
UPDATE Customers SET salary = 10000 WHERE id = 1;
UPDATE Customers SET salary = 35000 WHERE id = 2;
```
<details>
<summary>Output</summary>
1 row(s) updated.<br>
Salary difference: 10000<br>
1 row(s) updated.<br>
Salary difference: 5000<br>
</details>
3. Delete operation:
```sql
DELETE FROM Customers WHERE id = 1;
DELETE FROM Customers WHERE id = 2;
```
<details>
<summary>Output</summary>
1 row(s) deleted.<br>
Salary with value deleted: 10000<br>
1 row(s) deleted.<br>
Salary with value deleted: 35000<br>
</details>
---