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:
@@ -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>
|
||||
|
||||
---
|
||||
Reference in New Issue
Block a user