CREATE OR REPLACE PACKAGE exc4 AS
currentYear NUMBER;
PROCEDURE requireValidYear;
PROCEDURE removeTeachers(subjectDesc VARCHAR2);
FUNCTION getTeacherCount(subjectID NUMBER) RETURN NUMBER;
PROCEDURE addTeacherToSubject(subjectID NUMBER, teacherID NUMBER, semester NUMBER,
semestertype NUMBER, orderd NUMBER);
FUNCTION subjectsWithoutTeachersCount RETURN NUMBER;
PROCEDURE createTeacherSubjectsTable;
END exc4;
CREATE OR REPLACE PACKAGE BODY exc4 AS
PROCEDURE requireValidYear IS
BEGIN
IF currentYear < 1990 THEN
raise_application_error(-20000, 'Invalid year given!');
END IF;
-- DBMS_OUTPUT.PUT_LINE('Hello Wolrd = ' || exc4.currentYear);
END;
PROCEDURE removeTeachers(subjectDesc VARCHAR2) IS
subject_id NUMBER;
BEGIN
-- check if a valid year is defined
requireValidYear();
-- selecting the subject id belonging to the given subject description
SELECT fach_id INTO subject_id FROM faecher f
WHERE f.kbz = subjectDesc;
-- removing all teachers linked to the subject
DELETE FROM unterricht_tw04n181 u WHERE u.fach_id = subject_id
AND u.studienjahr = currentYear;
END;
FUNCTION getTeacherCount(subjectID NUMBER) RETURN NUMBER IS
teacher_count NUMBER;
BEGIN
-- check if a valid year is defined
requireValidYear();
-- selecting the number of teachers linked with the given
-- subject
SELECT COUNT(*) INTO teacher_count FROM unterricht_tw04n181 u
WHERE u.fach_id = subjectID AND u.studienjahr = currentYear;
RETURN teacher_count;
END;
PROCEDURE addTeacherToSubject(subjectID NUMBER, teacherID NUMBER, semester NUMBER,
semestertype NUMBER, orderd NUMBER) IS
BEGIN
-- check if a valid year is defined
requireValidYear();
-- check if there are less than 4 teachers added yet
IF getTeacherCount(subjectID) >= 4 THEN
raise_application_error(-20001, '4 teachers already added to the subject! No more allowed.');
END IF;
-- add a teacher to the subject
INSERT INTO unterricht_tw04n181 (unterricht_id, personen_id, fach_id, studienjahr, semester, semestertyp, reihung)
VALUES (unterricht_tw04n181_seq.nextval, subjectID, teacherID, currentYear, semester, semestertype, orderd);
END;
FUNCTION subjectsWithoutTeachersCount RETURN NUMBER IS
swnt NUMBER;
BEGIN
SELECT COUNT(*) INTO swnt FROM faecher f WHERE (
SELECT COUNT(*) FROM unterricht_tw04n181 u
WHERE u.fach_id = f.fach_id AND
u.studienjahr = currentYear) = 0;
RETURN swnt;
END;
PROCEDURE createTeacherSubjectsTable AS
stmt VARCHAR2(1000) := 'CREATE TABLE teachersubjects (teacher VARCHAR2(255), ';
total NUMBER := 0;
idx NUMBER := 0;
id NUMBER;
CURSOR faecher IS
SELECT * FROM faecher f;
BEGIN
DBMS_OUTPUT.ENABLE(1000000);
FOR fach IN faecher LOOP
total := total + 1;
END LOOP;
FOR fach IN faecher LOOP
stmt := stmt || '"' || fach.kbz || '" NUMBER';
IF idx < total-1 THEN
stmt := stmt || ',';
END IF;
idx := idx + 1;
END LOOP;
stmt := stmt || ')';
-- EXECUTE IMMEDIATE 'DROP TABLE IF EXISTS teachersubjects';
EXECUTE IMMEDIATE stmt;
-- DBMS_OUTPUT.PUT_LINE(stmt);
END;
PROCEDURE
END exc4;