cs348/PSO_9/scripts/lab.sql
2018-10-29 15:52:17 -04:00

67 lines
2.1 KiB
SQL

set serveroutput on size 32000
-- Print the names of students taking a specific class.
CREATE OR REPLACE PROCEDURE students_in_class(class_name IN Enrolled.cname%TYPE) AS
stu_number Enrolled.snum%TYPE;
stu_name Student.sname%TYPE;
CURSOR enr_cur IS SELECT snum FROM Enrolled WHERE cname=class_name;
enr_rec enr_cur%ROWTYPE;
BEGIN
FOR enr_rec IN enr_cur LOOP
stu_number := enr_rec.snum;
SELECT sname INTO stu_name FROM Student WHERE snum=stu_number;
dbms_output.put_line(stu_name);
END LOOP;
END students_in_class;
/
-- Insert a given faculty into the database.
-- CREATE OR REPLACE PROCEDURE insert_faculty(faculty IN Faculty%ROWTYPE) AS
CREATE OR REPLACE PROCEDURE insert_faculty(fid IN Faculty.fid%TYPE, fname IN Faculty.fname%TYPE, deptid IN Faculty.deptid%TYPE) AS
BEGIN
-- INSERT INTO Faculty VALUES faculty;
INSERT INTO Faculty VALUES(fid, fname, deptid);
END insert_faculty;
/
-- For each department, print the average age of students in that department.
CREATE OR REPLACE PROCEDURE average_age_by_dept AS
avg_age NUMBER;
num_students NUMBER;
dept Department.dname%TYPE;
CURSOR dept_cur IS SELECT DISTINCT deptid FROM Student;
CURSOR age_cur(did IN Student.deptid%TYPE) IS SELECT age FROM Student WHERE deptid = did;
dept_rec dept_cur%ROWTYPE;
age_rec age_cur%ROWTYPE;
BEGIN
FOR dept_rec IN dept_cur LOOP
avg_age := 0;
num_students := 0;
FOR age_rec IN age_cur(dept_rec.deptid) LOOP
avg_age := avg_age + age_rec.age;
num_students := num_students + 1;
END LOOP;
avg_age := avg_age / num_students;
SELECT dname
INTO dept
FROM Department
WHERE deptid = dept_rec.deptid;
dbms_output.put_line(dept || ' ' || avg_age);
END LOOP;
END average_age_by_dept;
/
DELETE FROM Faculty F WHERE F.fname = 'Adams';
BEGIN
students_in_class('ENG40000');
students_in_class('CS448');
students_in_class('STAT11000');
insert_faculty(1100,'Adams',66);
average_age_by_dept;
END;
/
SELECT * FROM Faculty;