You are on page 1of 9

Assignment 5

1. Write a PL/SQL stored Procedure for following requirements and call the
procedure in appropriate PL/SQL block. 1. Borrower(Rollin, Name, DateofIssue,
NameofBook, Status) 2. Fine(Roll_no,Date,Amt) Accept roll_no &name of book from
user. Check the number of days (from date of issue), if days are between 15 to 30
then fine amount will be Rs 5per day. If no. of days>30, per day fine will be Rs
50 per day & for days less than 30, Rs. 5 per day. After submitting the book,
status will change from I to R. If condition of fine is true, then details will be
stored into fine table.
CREATE TABLE Borrower298
(
rollin INT PRIMARY KEY,
Name VARCHAR(50),
DateofIssue DATE,
NameofBook VARCHAR(50),
status VARCHAR(50)
);

CREATE TABLE Fine298


(
Roll_no INT PRIMARY KEY,
currdate DATE,
Amt NUMBER(10)
);

INSERT INTO Borrower298 VALUES(1,'Sneha','12-jan-24','DSA','I');


INSERT INTO Borrower298 VALUES(2,'Rohit','27-jan-24','DBMS','I');
INSERT INTO Borrower298 VALUES(3,'Riya','12-feb-24','MA','I');
INSERT INTO Borrower298 VALUES(4,'Rahul','02-feb-24','NNFL','I');

CREATE OR REPLACE PROCEDURE calfine(day_count IN INT, fine OUT INT)


IS
BEGIN
IF day_count BETWEEN 15 AND 30 THEN
fine := 5 * day_count;
ELSIF day_count > 30 THEN
fine := 50 * day_count;
ELSE
fine := 5 * day_count;
END IF;
END calfine;
/
DECLARE
mroll INT;
idate DATE;
cdate DATE;
bookname VARCHAR(50);
day_count INT;
fine INT;
BEGIN
mroll := &rollin;
bookname := '&NameofBook'; -- Using single quotes for VARCHAR variables

SELECT SYSDATE, DateofIssue INTO cdate, idate FROM Borrower298 WHERE rollin =
mroll AND NameofBook = bookname;

day_count := TRUNC(cdate) - TRUNC(idate);


DBMS_OUTPUT.PUT_LINE('day_count: ' || day_count);
calfine(day_count, fine);
DBMS_OUTPUT.PUT_LINE('day_count: ' || day_count);
DBMS_OUTPUT.PUT_LINE('fine: ' || fine);

INSERT INTO Fine298 VALUES(mroll, cdate, fine);


UPDATE Borrower298 SET status = 'R' WHERE rollin = mroll AND NameofBook =
bookname;
END;

/
Output:

SQL> DROP TABLE Borrower298;

Table dropped.

SQL> DROP TABLE Fine298;

Table dropped.

SQL> CREATE TABLE Borrower298


2 (
3 rollin INT PRIMARY KEY,
4 Name VARCHAR(50),
5 DateofIssue DATE,
6 NameofBook VARCHAR(50),
7 status VARCHAR(50)
8 );

Table created.

SQL>
SQL> CREATE TABLE Fine298
2 (
3 Roll_no INT PRIMARY KEY,
4 currdate DATE,
5 Amt NUMBER(10)
6 );

Table created.

SQL>
SQL> INSERT INTO Borrower298 VALUES(1,'Sneha','12-jan-24','DSA','I');

1 row created.

SQL> INSERT INTO Borrower298 VALUES(2,'Rohit','27-jan-24','DBMS','I');

1 row created.

SQL> INSERT INTO Borrower298 VALUES(3,'Riya','12-feb-24','MA','I');

1 row created.

SQL> INSERT INTO Borrower298 VALUES(4,'Rahul','02-feb-24','NNFL','I');

1 row created.
SQL> CREATE OR REPLACE PROCEDURE calfine(day_count IN INT, fine OUT INT)
2 IS
3 BEGIN
4 IF day_count BETWEEN 15 AND 30 THEN
5 fine := 5 * day_count;
6 ELSIF day_count > 30 THEN
7 fine := 50 * day_count;
8 ELSE
9 fine := 5 * day_count;
10 END IF;
11 END calfine;
12 /

Procedure created.

SQL> DECLARE
2 mroll INT;
3 idate DATE;
4 cdate DATE;
5 bookname VARCHAR(50);
6 day_count INT;
7 fine INT;
8 BEGIN
9 mroll := &rollin;
10 bookname := '&NameofBook'; -- Using single quotes for VARCHAR variables
11
12 SELECT SYSDATE, DateofIssue INTO cdate, idate FROM Borrower298 WHERE
rollin = mroll AND NameofBook = bookname;
13
14 day_count := TRUNC(cdate) - TRUNC(idate);
15 DBMS_OUTPUT.PUT_LINE('day_count: ' || day_count);
16
17 calfine(day_count, fine);
18 DBMS_OUTPUT.PUT_LINE('day_count: ' || day_count);
19 DBMS_OUTPUT.PUT_LINE('fine: ' || fine);
20
21 INSERT INTO Fine298 VALUES(mroll, cdate, fine);
22 UPDATE Borrower298 SET status = 'R' WHERE rollin = mroll AND NameofBook =
bookname;
23 END;
24 /
Enter value for rollin: 1
old 9: mroll := &rollin;
new 9: mroll := 1;
Enter value for nameofbook: DSA
old 10: bookname := '&NameofBook'; -- Using single quotes for VARCHAR
variables
new 10: bookname := 'DSA'; -- Using single quotes for VARCHAR variables

PL/SQL procedure successfully completed.

SQL> /
Enter value for rollin: 2
old 9: mroll := &rollin;
new 9: mroll := 2;
Enter value for nameofbook: DBMS
old 10: bookname := '&NameofBook'; -- Using single quotes for VARCHAR
variables
new 10: bookname := 'DBMS'; -- Using single quotes for VARCHAR variables
PL/SQL procedure successfully completed.

SQL> /
Enter value for rollin: 3
old 9: mroll := &rollin;
new 9: mroll := 3;
Enter value for nameofbook: MA
old 10: bookname := '&NameofBook'; -- Using single quotes for VARCHAR
variables
new 10: bookname := 'MA'; -- Using single quotes for VARCHAR variables

PL/SQL procedure successfully completed.

SQL> SELECT *FROM Fine298;

ROLL_NO CURRDATE AMT


---------- --------- ----------
1 20-MAR-24 3400
2 20-MAR-24 2650
3 20-MAR-24 1850
2. Write a stored function in PL/SQL for given requirement and use the same in
PL/SQL block. Account no. and branch name will be accepted from user. The same will
be searched in table acct_details. If status of account is active then display
appropriate message and also store the account details in active_acc_details table,
otherwise display message on screen “account is inactive”.

CREATE TABLE acc_details298


(
acc_no INT PRIMARY KEY,
branch_name VARCHAR(10),
status VARCHAR(10)
);

CREATE TABLE active_account


(
accno INT PRIMARY KEY,
branchname VARCHAR(10)
);

INSERT INTO acc_details298 VALUES(1234, 'Akurdi','A');


INSERT INTO acc_details298 VALUES(1934, 'Ravet','A');
INSERT INTO acc_details298 VALUES(1004, 'Nashik','I');
INSERT INTO acc_details298 VALUES(1804, 'Viman','I');
INSERT INTO acc_details298 VALUES(1704, 'Nigdi','I');

CREATE OR REPLACE FUNCTION fun(macc INT, mbranch VARCHAR)


RETURN VARCHAR
IS
mstatus VARCHAR(10);
BEGIN
SELECT status INTO mstatus FROM acc_details298 WHERE acc_no=macc AND
branch_name=mbranch;
IF mstatus='A'
THEN
INSERT INTO active_account VALUES (macc,mbranch);
RETURN 'Account is active';
ELSE
RETURN 'Account is Inactive';
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 'ACCOUNT NO NOT FOUND';
END FUN;
/

DECLARE
macc INT;
mbranch VARCHAR(20);
mres VARCHAR(20);
BEGIN
macc:= &acc_no;
mbranch:='&branch_name';
mres:=fun(macc, mbranch);
DBMS_OUTPUT.PUT_LINE(mres);
END;
/
Output:
CREATE TABLE acc_details298
2 (
3 acc_no INT PRIMARY KEY,
4 branch_name VARCHAR(10),
5 status VARCHAR(10)
6 );

Table created.

SQL>
SQL> CREATE TABLE active_account
2 (
3 accno INT PRIMARY KEY,
4 branchname VARCHAR(10)
5 );

Table created.

SQL>
SQL> INSERT INTO acc_details298 VALUES(1234, 'Akurdi','A');

1 row created.

SQL> INSERT INTO acc_details298 VALUES(1934, 'Ravet','A');

1 row created.

SQL> INSERT INTO acc_details298 VALUES(1004, 'Nashik','I');

1 row created.

SQL> INSERT INTO acc_details298 VALUES(1804, 'Viman','I');

1 row created.

SQL> INSERT INTO acc_details298 VALUES(1704, 'Nigdi','I');

1 row created.
SQL> CREATE OR REPLACE FUNCTION fun(macc INT, mbranch VARCHAR)
2 RETURN VARCHAR
3 IS
4 mstatus VARCHAR(10);
5 BEGIN
6 SELECT status INTO mstatus FROM acc_details298 WHERE acc_no=macc AND
branch_name=mbranch;
7 IF mstatus='A'
8 THEN
9 INSERT INTO active_account VALUES (macc,mbranch);
10 RETURN 'Account is active';
11 ELSE
12 RETURN 'Account is Inactive';
13 END IF;
14 EXCEPTION
15 WHEN NO_DATA_FOUND THEN
16 RETURN 'ACCOUNT NO NOT FOUND';
17 END FUN;
18 /

Function created.

SQL>
SQL> DECLARE
2 macc INT;
3 mbranch VARCHAR(20);
4 mres VARCHAR(20);
5 BEGIN
6 macc:=&acc_no;
7 mbranch:='&branch_name';
8 mres:=fun(macc, mbranch);
9 DBMS_OUTPUT.PUT_LINE(mres);
10 END;
11 /
Enter value for acc_no: 1234
old 6: macc:=&acc_no;
new 6: macc:=1234;
Enter value for branch_name: Akurdi
old 7: mbranch:='&branch_name';
new 7: mbranch:='Akurdi';
Account is active

PL/SQL procedure successfully completed.

SQL> /
Enter value for acc_no: 1004
old 6: macc:=&acc_no;
new 6: macc:=1004;
Enter value for branch_name: Nashik
old 7: mbranch:='&branch_name';
new 7: mbranch:='Nashik';
Account is Inactive

PL/SQL procedure successfully completed.

SQL> SELECT *FROM active_account;

ACCNO BRANCHNAME
---------- ----------
1234 Akurdi
3. 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 and900 category
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)
CREATE TABLE stud_marks
(
roll INT PRIMARY KEY,
name VARCHAR(20),
marks INT
);
CREATE TABLE Result
(
rollno INT PRIMARY KEY,
name VARCHAR(20),
class VARCHAR(10)
);
INSERT INTO stud_marks VALUES(1,'Rohan',1400);
INSERT INTO stud_marks VALUES(2,'Rahul',900);
INSERT INTO stud_marks VALUES(3,'Ahaan',850);

CREATE OR REPLACE PROCEDURE proc_grade(mroll IN INT, mname IN VARCHAR)


IS
mmarks INT;
cat VARCHAR(10);
BEGIN
cat := '';

SELECT marks INTO mmarks FROM stud_marks WHERE roll = mroll AND name = mname;

IF mmarks >= 990 AND mmarks <= 1500 THEN


cat := 'Distinction';
ELSIF mmarks >= 900 AND mmarks <= 989 THEN
cat := 'First class';
ELSIF mmarks >= 825 AND mmarks <= 899 THEN
cat := 'Second class';
ELSE
cat := 'Passed';
END IF;
DBMS_OUTPUT.PUT_LINE(cat);
INSERT INTO Result VALUES(mroll, mname, cat);
END proc_grade;
/

DECLARE
mroll INT;
mname VARCHAR(20);
BEGIN
mroll:= &roll;
mname:= '&name';
proc_grade(mroll, mname);
END;
/
Output:
SQL> CREATE TABLE stud_marks
2 (
3 roll INT PRIMARY KEY,
4 name VARCHAR(20),
5 marks INT
6 );

Table created.

SQL> CREATE TABLE Result


2 (
3 rollno INT PRIMARY KEY,
4 name VARCHAR(20),
5 class VARCHAR(10)
6 );

Table created.

SQL> INSERT INTO stud_marks VALUES(1,'Rohan',1400);

1 row created.

SQL> INSERT INTO stud_marks VALUES(2,'Rahul',900);

1 row created.

SQL> INSERT INTO stud_marks VALUES(3,'Ahaan',850);

1 row created.
SQL> CREATE OR REPLACE PROCEDURE proc_grade(mroll IN INT, mname IN VARCHAR)
2 IS
3 mmarks INT;
4 cat VARCHAR(100);
5 BEGIN
6 cat := '';
7
8 SELECT marks INTO mmarks FROM stud_marks WHERE roll = mroll AND name =
mname;
9
10 IF mmarks >= 990 AND mmarks <= 1500 THEN
11 cat := 'Distinction';
12 ELSIF mmarks >= 900 AND mmarks <= 989 THEN
13 cat := 'First class';
14 ELSIF mmarks >= 825 AND mmarks <= 899 THEN
15 cat := 'Second class';
16 ELSE
17 cat := 'Passed';
18 END IF;
19 DBMS_OUTPUT.PUT_LINE(cat);
20 INSERT INTO Result VALUES(mroll, mname, cat);
21 END proc_grade;
22 /

Procedure created.

SQL>
SQL> DECLARE
2 mroll INT;
3 mname VARCHAR(20);
4 BEGIN
5 mroll:= &roll;
6 mname:= '&name';
7 proc_grade(mroll, mname);
8 END;
9 /
Enter value for roll: 1
old 5: mroll:= &roll;
new 5: mroll:= 1;
Enter value for name: Rohan
old 6: mname:= '&name';
new 6: mname:= 'Rohan';
Distinction

PL/SQL procedure successfully completed.

SQL> /
Enter value for roll: 2
old 5: mroll:= &roll;
new 5: mroll:= 2;
Enter value for name: Rahul
old 6: mname:= '&name';
new 6: mname:= 'Rahul';
First class

PL/SQL procedure successfully completed.

SQL> SELECT *FROM Result;

ROLLNO NAME
---------- --------------------
CLASS
--------------------------------------------------------------------------------
1 Rohan
Distinction

2 Rahul
First class

You might also like