diff --git a/DDL.sql b/DDL.sql new file mode 100644 index 0000000..2fa0211 --- /dev/null +++ b/DDL.sql @@ -0,0 +1,69 @@ +drop table advisor; +drop table takes; +drop table teaches; +drop table course; +drop table instructor; +drop table student; +drop table department; + +create table department( + dept_name varchar(5), + no_of_classrooms number(2, 0) check (no_of_classrooms > 0), + faculty varchar(5) check(faculty in ('CE', 'EEE', 'ME')), + primary key(dept_name) +); + +create table student( + id varchar(5), + name varchar(40) not null, + dept_name varchar(5), + tot_cred number(5, 2) check(tot_cred >= 0), + cgpa number(3, 2), + primary key(id), + foreign key(dept_name) references department(dept_name) on delete set null +); + +create table instructor( + id varchar(5), + name varchar(40) not null, + dept_name varchar(5), + salary number(8, 2) check(salary >= 20000), + primary key(id), + foreign key(dept_name) references department(dept_name) on delete set null +); + +create table course( + course_id varchar(10), + title varchar(60) not null, + dept_name varchar(5), + credit number(3, 2) check (credit >= 0.75), + semester varchar(3) check (semester in ('1st', '2nd')), + year varchar(3) check (year in ('1st', '2nd', '3rd', '4th')), + primary key(course_id), + foreign key(dept_name) references department(dept_name) on delete set null +); + +create table teaches( + id varchar(5), + course_id varchar(10), + primary key(id, course_id), + foreign key(id) references instructor(id) on delete cascade, + foreign key(course_id) references course(course_id) on delete cascade +); + +create table takes( + id varchar(5), + course_id varchar(10), + grade varchar(1) check (grade in ('A', 'B', 'C', 'D', 'F')), + primary key(id, course_id), + foreign key(id) references student(id) on delete cascade, + foreign key(course_id) references course(course_id) on delete cascade +); + +create table advisor( + s_id varchar(5), + i_id varchar(5), + primary key(s_id), + foreign key(s_id) references student(id) on delete cascade, + foreign key(i_id) references instructor(id) on delete set null +); \ No newline at end of file diff --git a/DML.sql b/DML.sql new file mode 100644 index 0000000..ef2202c --- /dev/null +++ b/DML.sql @@ -0,0 +1,232 @@ +insert into department values('CE', 24, 'CE'); +insert into department values('URP', 16, 'CE'); +insert into department values('BECM', 16, 'CE'); +insert into department values('EEE', 24, 'EEE'); +insert into department values('CSE', 20, 'EEE'); +insert into department values('ECE', 16, 'EEE'); +insert into department values('ME', 24, 'ME'); +insert into department values('IEM', 16, 'ME'); +insert into department values('MTE', 12, 'ME'); + +insert into student values('19101', 'Rayhanul Islam Chowdhury', 'CE', 22.00, null); +insert into student values('19401', 'Kamrul Hasan Kallol', 'URP', 20.00, null); +insert into student values('19701', 'Sanad Das Pranto', 'BECM', 20.00, null); +insert into student values('19201', 'Nakkhatra Roy Shuvo', 'EEE', 22.00, null); +insert into student values('19501', 'Samiul Islam Shoaib', 'CSE', 21.00, null); +insert into student values('19801', 'Adham Abhi', 'ECE', 20.50, null); +insert into student values('19301', 'Nishat Tasnim Zinia', 'ME', 22.00, null); +insert into student values('19601', 'Progga Paromita Adrita', 'IEM', 20.00, null); +insert into student values('19901', 'Sumaya Islam Shoitee', 'MTE', 19.50, null); +insert into student values('19102', 'Sabbir Rahman', 'CE', 22.00, null); +insert into student values('19402', 'Shohanur Rahman Shaikat', 'URP', 20.00, null); +insert into student values('19702', 'Nazmul Islam Sadee', 'BECM', 20.00, null); +insert into student values('19202', 'Jahidul Islam Joy', 'EEE', 22.00, null); +insert into student values('19502', 'Sabbir Ahmed', 'CSE', 21.00, null); +insert into student values('19802', 'Shoumik Ahmed Siam', 'ECE', 20.50, null); +insert into student values('19302', 'Mubtashim Abrar Nihal', 'ME', 22.00, null); +insert into student values('19602', 'Mihrab Hossain Mafi', 'IEM', 20.00, null); +insert into student values('19902', 'Abu Taher', 'MTE', 19.50, null); +--03 +insert into student values('19103', 'Shaikh Mahmud', 'CE', 19.50, null); +insert into student values('19403', 'Mohammad Al Fahad', 'URP', 22.00, null); +insert into student values('19703', 'Imtiaj Hossain', 'BECM', 21.00, null); +insert into student values('19203', 'Tanoy Bhuiyan', 'EEE', 20.00, null); +insert into student values('19503', 'Jahidul Islam', 'CSE', 20.50, null); +insert into student values('19803', 'Mirajul Islam', 'ECE', 21.50, null); +insert into student values('19303', 'Tanvir Bhuiyan', 'ME', 21.00, null); +insert into student values('19603', 'Athar Ishrak', 'IEM', 22.00, null); +insert into student values('19903', 'Shahadat Hossain', 'MTE', 20.00, null); +--04 +insert into student values('19104', 'Kazi Fahim Tahmid', 'CE', 19.50, null); +insert into student values('19404', 'Rifat Morshed', 'URP', 22.00, null); +insert into student values('19704', 'Eleus Ahammad', 'BECM', 21.00, null); +insert into student values('19204', 'Shovon Sharma', 'EEE', 20.00, null); +insert into student values('19504', 'Hasibul Islam', 'CSE', 20.50, null); +insert into student values('19804', 'Prottoy Roy', 'ECE', 21.50, null); +insert into student values('19304', 'Chinmoy Modok', 'ME', 21.00, null); +insert into student values('19604', 'Akik Ashraf Rafi', 'IEM', 22.00, null); +insert into student values('19904', 'Abdulla Rahman', 'MTE', 20.00, null); + + +insert into instructor values('11101', 'Dr. Muhammed Alamgir', 'CE', 120000); +insert into instructor values('11102', 'Dr. Quazi Hamidul Bari', 'CE', 110000); +insert into instructor values('22201', 'Dr. Md. Nurunnabi Mollah', 'EEE', 120000); +insert into instructor values('22202', 'Dr. Md. Rafiqul Islam', 'EEE', 110000); +insert into instructor values('33301', 'Dr. Md. Kutub Uddin', 'ME', 120000); +insert into instructor values('33302', 'Dr. Khandkar Aftab Hossain', 'ME', 110000); +insert into instructor values('44401', 'Dr. Md. Mustafa Saroar', 'URP', 100000); +insert into instructor values('44402', 'Tusar Kanti Roy', 'URP', 90000); +insert into instructor values('55501', 'Dr. M. M. A. Hashem', 'CSE', 100000); +insert into instructor values('55502', 'Dr. K. M. Azharul Hasan', 'CSE', 90000); +insert into instructor values('66601', 'Dr. Subrata Talapatra', 'IEM', 100000); +insert into instructor values('66602', 'Dr. Md. Rafiquzzaman', 'IEM', 90000); +insert into instructor values('77701', 'Md. Ikramul Hoque', 'BECM', 80000); +insert into instructor values('77702', 'Jhumana Akter', 'BECM', 70000); +insert into instructor values('88801', 'Dr. Md. Mostafizur Rahman', 'ECE', 80000); +insert into instructor values('88802', 'Dr. Md. Rafuque Hossain', 'ECE', 70000); +insert into instructor values('99901', 'Sourav Roy', 'MTE', 50000); +insert into instructor values('99902', 'Dr. Asief Javed', 'MTE', 50000); + +insert into course values('CE3161', 'Engineering Hydraulics', 'CE', 4.00, '1st', '3rd'); +insert into course values('CE3141', 'Environmental Engineering-I', 'CE', 3.00, '1st', '3rd'); +insert into course values('URP3161', 'Housing and Real Estate Development', 'URP', 3.00, '1st', '3rd'); +insert into course values('URP3107', 'Elements of Solid Mechanics', 'URP', 3.00, '1st', '3rd'); +insert into course values('BECM3107', 'Construction Contract and Law', 'BECM', 4.00, '1st', '3rd'); +insert into course values('BECM3115', 'Climate and Architectural Design', 'BECM', 2.00, '1st', '3rd'); +insert into course values('EEE3113', 'Digital Electronics and Logic Design', 'EEE', 3.00, '1st', '3rd'); +insert into course values('EEE3116', 'Sessional on Electrical Measurement and Instrumentation', 'EEE', 0.75, '1st', '3rd'); +insert into course values('CSE3100', 'Web Programming Laboratory', 'CSE', 1.50, '1st', '3rd'); +insert into course values('CSE3101', 'Operating Systems', 'CSE', 3.00, '1st', '3rd'); +insert into course values('ECE3100', 'Internet Programming Laboratory', 'ECE', 1.50, '1st', '3rd'); +insert into course values('ECE3109', 'Numerical Analysis', 'ECE', 3.00, '1st', '3rd'); +insert into course values('ME3100', 'Special Studies', 'ME', 0.75, '1st', '3rd'); +insert into course values('ME3119', 'Statistics &. Quality Control', 'ME', 4.00, '1st', '3rd'); +insert into course values('IPE3103', 'Engineering Metallurgy', 'IEM', 3.00, '1st', '3rd'); +insert into course values('IPE3115', 'Engineering Economy', 'IEM', 3.00, '1st', '3rd'); +insert into course values('MTE3100', 'Seminar and Scientific Writing', 'MTE', 0.75, '1st', '3rd'); +insert into course values('MTE3103', 'Microprocessor, Microcontroller and Interfacing', 'MTE', 3.00, '1st', '3rd'); + +insert into teaches values('11101', 'CE3161'); +insert into teaches values('11102', 'CE3141'); +insert into teaches values('22201', 'EEE3113'); +insert into teaches values('22202', 'EEE3116'); +insert into teaches values('33301', 'ME3100'); +insert into teaches values('33302', 'ME3119'); +insert into teaches values('44401', 'URP3161'); +insert into teaches values('44402', 'URP3107'); +insert into teaches values('55501', 'CSE3100'); +insert into teaches values('55502', 'CSE3101'); +insert into teaches values('66601', 'IPE3103'); +insert into teaches values('66602', 'IPE3115'); +insert into teaches values('77701', 'BECM3107'); +insert into teaches values('77702', 'BECM3115'); +insert into teaches values('88801', 'ECE3100'); +insert into teaches values('88802', 'ECE3109'); +insert into teaches values('99901', 'MTE3100'); +insert into teaches values('99902', 'MTE3103'); + +insert into takes values('19101', 'CE3161', 'A'); +insert into takes values('19101', 'CE3141', 'B'); +insert into takes values('19102', 'CE3161', 'C'); +insert into takes values('19102', 'CE3141', 'D'); +insert into takes values('19103', 'CE3161', 'D'); +insert into takes values('19103', 'CE3141', 'C'); +insert into takes values('19104', 'CE3161', 'B'); +insert into takes values('19104', 'CE3141', 'A'); + +insert into takes values('19201', 'EEE3113', 'B'); +insert into takes values('19201', 'EEE3116', 'C'); +insert into takes values('19202', 'EEE3113', 'D'); +insert into takes values('19202', 'EEE3116', 'A'); +insert into takes values('19203', 'EEE3113', 'A'); +insert into takes values('19203', 'EEE3116', 'D'); +insert into takes values('19204', 'EEE3113', 'C'); +insert into takes values('19204', 'EEE3116', 'B'); + +insert into takes values('19301', 'ME3100', 'C'); +insert into takes values('19301', 'ME3119', 'D'); +insert into takes values('19302', 'ME3100', 'A'); +insert into takes values('19302', 'ME3119', 'B'); +insert into takes values('19303', 'ME3100', 'B'); +insert into takes values('19303', 'ME3119', 'A'); +insert into takes values('19304', 'ME3100', 'D'); +insert into takes values('19304', 'ME3119', 'C'); + +insert into takes values('19401', 'URP3161', 'D'); +insert into takes values('19401', 'URP3107', 'A'); +insert into takes values('19402', 'URP3161', 'B'); +insert into takes values('19402', 'URP3107', 'C'); +insert into takes values('19403', 'URP3161', 'C'); +insert into takes values('19403', 'URP3107', 'B'); +insert into takes values('19404', 'URP3161', 'A'); +insert into takes values('19404', 'URP3107', 'D'); + +insert into takes values('19501', 'CSE3100', 'A'); +insert into takes values('19501', 'CSE3101', 'B'); +insert into takes values('19502', 'CSE3100', 'C'); +insert into takes values('19502', 'CSE3101', 'D'); +insert into takes values('19503', 'CSE3100', 'D'); +insert into takes values('19503', 'CSE3101', 'C'); +insert into takes values('19504', 'CSE3100', 'B'); +insert into takes values('19504', 'CSE3101', 'A'); + +insert into takes values('19601', 'IPE3103', 'B'); +insert into takes values('19601', 'IPE3115', 'C'); +insert into takes values('19602', 'IPE3103', 'D'); +insert into takes values('19602', 'IPE3115', 'A'); +insert into takes values('19603', 'IPE3103', 'A'); +insert into takes values('19603', 'IPE3115', 'D'); +insert into takes values('19604', 'IPE3103', 'C'); +insert into takes values('19604', 'IPE3115', 'B'); + +insert into takes values('19701', 'BECM3107', 'C'); +insert into takes values('19701', 'BECM3115', 'D'); +insert into takes values('19702', 'BECM3107', 'A'); +insert into takes values('19702', 'BECM3115', 'B'); +insert into takes values('19703', 'BECM3107', 'B'); +insert into takes values('19703', 'BECM3115', 'A'); +insert into takes values('19704', 'BECM3107', 'D'); +insert into takes values('19704', 'BECM3115', 'C'); + +insert into takes values('19801', 'ECE3100', 'D'); +insert into takes values('19801', 'ECE3109', 'A'); +insert into takes values('19802', 'ECE3100', 'B'); +insert into takes values('19802', 'ECE3109', 'C'); +insert into takes values('19803', 'ECE3100', 'C'); +insert into takes values('19803', 'ECE3109', 'B'); +insert into takes values('19804', 'ECE3100', 'C'); +insert into takes values('19804', 'ECE3109', 'D'); + +insert into takes values('19901', 'MTE3100', 'A'); +insert into takes values('19901', 'MTE3103', 'B'); +insert into takes values('19902', 'MTE3100', 'C'); +insert into takes values('19902', 'MTE3103', 'D'); +insert into takes values('19903', 'MTE3100', 'D'); +insert into takes values('19903', 'MTE3103', 'C'); +insert into takes values('19904', 'MTE3100', 'D'); +insert into takes values('19904', 'MTE3103', 'A'); + +insert into advisor values ('19101', '11101'); +insert into advisor values ('19102', '11101'); +insert into advisor values ('19103', '11101'); +insert into advisor values ('19104', '11101'); + +insert into advisor values ('19201', '22201'); +insert into advisor values ('19202', '22201'); +insert into advisor values ('19203', '22201'); +insert into advisor values ('19204', '22201'); + +insert into advisor values ('19301', '33301'); +insert into advisor values ('19302', '33301'); +insert into advisor values ('19303', '33301'); +insert into advisor values ('19304', '33301'); + +insert into advisor values ('19401', '44401'); +insert into advisor values ('19402', '44401'); +insert into advisor values ('19403', '44401'); +insert into advisor values ('19404', '44401'); + +insert into advisor values ('19501', '55501'); +insert into advisor values ('19502', '55501'); +insert into advisor values ('19503', '55501'); +insert into advisor values ('19504', '55501'); + +insert into advisor values ('19601', '66601'); +insert into advisor values ('19602', '66601'); +insert into advisor values ('19603', '66601'); +insert into advisor values ('19604', '66601'); + +insert into advisor values ('19701', '77701'); +insert into advisor values ('19702', '77701'); +insert into advisor values ('19703', '77701'); +insert into advisor values ('19704', '77701'); + +insert into advisor values ('19801', '88801'); +insert into advisor values ('19802', '88801'); +insert into advisor values ('19803', '88801'); +insert into advisor values ('19804', '88801'); + +insert into advisor values ('19901', '99901'); +insert into advisor values ('19902', '99901'); +insert into advisor values ('19903', '99901'); +insert into advisor values ('19904', '99901'); \ No newline at end of file diff --git a/Query+PL-SQL.sql b/Query+PL-SQL.sql new file mode 100644 index 0000000..854a5ce --- /dev/null +++ b/Query+PL-SQL.sql @@ -0,0 +1,264 @@ +-- Aggregate Functions(count, sum, avg, min, max) with having +-- Total no. of classrooms in each faculty +select faculty, sum(no_of_classrooms) as Total_no_of_classrooms from department group by faculty; +-- Average salary of teachers in each department +select dept_name, avg(salary) as Average_salary from instructor group by dept_name; +-- Total no. of students in each department +select dept_name, count(*) as Total_no_of_students from student group by dept_name; +-- Minimum salary of teachers in each department +select dept_name, min(salary) as Minimum_salary from instructor group by dept_name; +-- Maximum salary of teachers in each department +select dept_name, max(salary) as Maximum_salary from instructor group by dept_name; +-- Name of faculty having more than 55 classrooms with no. of classrooms and no. of departments +select faculty, sum(no_of_classrooms) as Total_no_of_classrooms, count(dept_name) as Number_of_departments from department group by faculty having sum(no_of_classrooms) > 55; + +-- String +-- Name of the 1st boy/girl in each department +select dept_name, name from student where id like '____1'; + +-- Union, Intersection, Except +-- Name of dept having at least one student with total credit more than 20 or having more than 15 classrooms +(select dept_name from student where tot_cred > 20) union (select dept_name from department where no_of_classrooms > 20); +-- Name of courses having credit greater than or equal to 3.0 and at least one student has got A on that course +(select course_id from course where credit >= 3.0) intersect (select course_id from takes where grade like 'A'); +-- Name of courses having credit equal to 4.00 and students taking that course has got less than 'A' +(select course_id from course where credit = 4.0) except (select course_id from takes where grade like 'A'); + +-- In, Not in +-- Name of students who have taken courses taught by instructor with id = '11101'; +select name from student where id in (select id from takes where course_id in (select course_id from teaches where id like '11101')); +-- Titles of courses that are taught in 3rd year but not in 'ME' faculty +select title from course where year like '3rd' and dept_name not in (select dept_name from department where faculty like 'ME'); + +-- And, Or, Not +-- Title of all course taught in 3rd year in 'CSE' dept +select title from course where dept_name like 'CSE' and year like '3rd'; +-- Title of all courses taught in 'CSE' dept or 'EEE' dept +select title from course where dept_name like 'CSE' or dept_name like 'EEE'; +-- Name of instructors who are not in 'CSE' dept; +select name from instructor where not dept_name like 'CSE'; + +-- Some, All, Exist, Distinct +-- Name of students who have got D in some courses +select id from student where id = some(select id from takes where grade like 'D'); +-- Name of instructors in each faculty having highest salary +select name from instructor where salary >= all (select salary from instructor); +-- Name of students who have got A in some courses +select name from student where exists (select * from takes where grade like 'A' and student.id = takes.id); +-- Name of all faculty +select distinct faculty from department; + +-- Join +-- List of all advisors and their advisees of 'EEE' faculty +select i.name as Advisor, s.name as Advisee from student s join advisor a on s.id = a.s_id join instructor i on i.id = a.i_id where s.dept_name in (select dept_name from department where faculty like 'EEE'); + +-- View +-- Find Top 3 students of 'EEE' faculty +create or replace view results as select name, fCgpa(id) as cgpa from student where dept_name in (select dept_name from department where faculty like 'EEE') order by cgpa desc; +select * from results fetch next 3 rows only; + +-- With +-- List of faculty which has the maximum average salary +with avg_salary(faculty, avg_sal) as (select faculty, avg(salary) from instructor i join department d on i.dept_name = d.dept_name group by faculty) +select faculty, avg_sal from avg_salary where avg_sal = (select max(avg_sal) from avg_salary); + +-- PL/SQL +-- Find the salary of the advisor of student having ID = '19101' +set serveroutput on +declare +name instructor.name%type; +salary instructor.salary%type; +begin +select name, salary into name, salary from instructor where id = (select i_id from advisor where s_id = '19101'); +dbms_output.put_line('Salary of ' || name || ': ' || salary); +end; +/ +-- Find information of all 4 credit courses +set serveroutput on +declare +cursor c is select * from course where credit = 4.0; +course_info course%rowtype; +begin +open c; +fetch c into course_info.course_id, course_info.title, course_info.dept_name, course_info.credit, course_info.semester, course_info.year; +while c%found loop +dbms_output.put_line('Course ID: ' || course_info.course_id || ', Title: ' || course_info.title || ', Dept. Name: ' || course_info.dept_name || ', Year: ' || course_info.year || ', Semester: ' || course_info.semester); +fetch c into course_info.course_id, course_info.title, course_info.dept_name, course_info.credit, course_info.semester, course_info.year; +end loop; +close c; +end; +/ +-- Find the name of the students who are of 'EEE' faculty and got A in any course +set serveroutput on +declare +cursor c is select name from student where dept_name in (select dept_name from department where faculty like 'EEE') and id in (select id from takes where grade like 'A'); +type namearray is varray(20) of student.name%type; +names namearray := namearray(); +cnt number := 0; +begin + for info in c loop + names.extend; + cnt := cnt + 1; + names(cnt) := info.name; + end loop; + for i in 1 .. cnt loop + dbms_output.put_line('Name: ' || names(i)); + end loop; +end; +/ +-- Show the faculty name of each student +set serveroutput on +declare +cursor c is select * from student; +begin + for info in c loop + if info.id like '__1%' or info.id like '__4%' or info.id like '__7%' + then + dbms_output.put_line('Name: ' || info.name || ', Faculty: CE'); + elsif info.id like '__2%' or info.id like '__5%' or info.id like '__8%' + then + dbms_output.put_line('Name: ' || info.name || ', Faculty: EEE'); + else + dbms_output.put_line('Name: ' || info.name || ', Faculty: ME'); + end if; + end loop; +end; +/ +-- Name of students who have advisor having minimum salary +set serveroutput on +declare +cursor c1 is select * from instructor where salary = (select min(salary) from instructor); +cursor c2 is select * from advisor; +cnt number := 0; +adv_name instructor.name%type; +stud_name student.name%type; +min_sal instructor.salary%type; +begin +select min(salary) into min_sal from instructor; +dbms_output.put_line('Minimum Salary: ' || min_sal); +for i in c1 loop + adv_name := i.name; + for j in c2 loop + if i.id like j.i_id + then + select name into stud_name from student where id = j.s_id; + dbms_output.put_line('Advisor: ' || adv_name || ', Student: ' || stud_name); + end if; + end loop; +end loop; +end; +/ + +-- Procedure +-- Find all information of a student by a given ID +create or replace procedure fInfoProc(varId in student.id%type) as +cursor c is select * from takes where id = varId; +type courseIdArray is varray(10) of course.title%type; +type gradeArray is varray(10) of takes.grade%type; +info1 student%rowtype; +info2 instructor.name%type; +info3 takes%rowtype; +courses courseIdArray := courseIdArray(); +grades gradeArray := gradeArray(); +cnt integer := 0; +begin + select name, dept_name, tot_cred into info1.name, info1.dept_name, info1.tot_cred from student where id = varId; + select name into info2 from instructor where id = (select i_id from advisor where s_id = varId); + for info in c loop + courses.extend; + grades.extend; + cnt := cnt + 1; + select title into courses(cnt) from course where course_id = info.course_id; + grades(cnt) := info.grade; + end loop; + dbms_output.put_line('Name: ' || info1.name); + dbms_output.put_line('Dept. Name: ' || info1.dept_name); + dbms_output.put_line('Total Credit: ' || info1.tot_cred); + dbms_output.put_line('Advisor Name: ' || info2); + dbms_output.put_line('---<< Course Title with Grades >>---'); + for i in 1 .. cnt loop + dbms_output.put_line('Course: ' || courses(i) || ', Grade: ' || grades(i)); + end loop; +end; +/ +begin +finfoproc(19101); +end; +/ + +-- Function +-- Find the result of student by a given ID +create or replace function fCgpa(varId in student.id%type) return number as +cursor c is select * from takes where id = varId; +grad numeric(2, 1); +cred numeric(2, 1); +tot_grad numeric(4, 2) := 0; +tot_cred numeric(4, 2) := 0; +cgpa numeric(4, 2) := 0; +begin +for info in c loop + if info.grade like 'A' + then + grad := 4.0; + elsif info.grade like 'B' + then + grad := 3.5; + elsif info.grade like 'C' + then + grad := 3.0; + elsif info.grade like 'D' + then + grad := 2.5; + else + grad := 0; + end if; + select credit into cred from course where info.course_id like course.course_id; + tot_grad := tot_grad + cred * grad; + tot_cred := tot_cred + cred; +end loop; +cgpa := tot_grad / tot_cred; +return cgpa; +end; +/ +declare +vId student.id%type := 19101; +cgpa numeric(4, 2) := 0; +name student.name%type; +begin +select name into name from student where id = vId; +cgpa := fCgpa(vId); +dbms_output.put_line('Name: ' || name || ', CGPA: ' || cgpa); +end; +/ + +--Trigger +-- Update the cgpa attribute of student on insert/update of takes relation +create or replace trigger updCgpa +before insert or update on takes +referencing old as o new as n +for each row +declare +tot_grad numeric(5, 2); +cnt number; +grad takes.grade%type; +begin + select sum(case grade + when 'A' then 4 + when 'B' then 3.5 + when 'C' then 3 + when 'D' then 2.5 + else 0 + end), count(*) into tot_grad, cnt from takes where id = :n.id; + tot_grad := tot_grad + (case :n.grade + when 'A' then 4 + when 'B' then 3.5 + when 'C' then 3 + when 'D' then 2.5 + else 0 + end); + cnt := cnt + 1; + update student set cgpa = tot_grad / cnt where id = :n.id; +end; +/ + +