F
F
-- Grant Privileges
EXECUTE IMMEDIATE 'GRANT DBA, CREATE SESSION, CREATE TABLE, CREATE TYPE, CREATE
SEQUENCE TO HU_CS_ATTENDANCE_ADMIN';
EXECUTE IMMEDIATE 'GRANT UNLIMITED TABLESPACE TO HU_CS_ATTENDANCE_ADMIN';
END;
/
-- Enable Output
SET SERVEROUTPUT ON;
-- Member Functions
MEMBER FUNCTION get_batch_duration RETURN NUMBER,
MEMBER FUNCTION get_batch_description RETURN VARCHAR2,
MEMBER FUNCTION is_current_batch RETURN BOOLEAN
);
/
-- Member Functions
MEMBER FUNCTION calculate_study_hours RETURN NUMBER,
MEMBER FUNCTION get_course_difficulty RETURN VARCHAR2,
MEMBER FUNCTION is_advanced_course RETURN BOOLEAN
);
/
-- Member Functions
MEMBER FUNCTION get_full_name RETURN VARCHAR2,
MEMBER FUNCTION get_email_domain RETURN VARCHAR2,
MEMBER FUNCTION is_valid_email RETURN BOOLEAN
);
/
-- Member Functions
MEMBER FUNCTION get_class_type_description RETURN VARCHAR2,
MEMBER FUNCTION get_semester_description RETURN VARCHAR2,
MEMBER FUNCTION is_exam_class RETURN BOOLEAN
);
/
-- Member Functions
MEMBER FUNCTION get_full_name RETURN VARCHAR2,
MEMBER FUNCTION get_email_username RETURN VARCHAR2,
MEMBER FUNCTION is_current_student RETURN BOOLEAN
);
/
-- Member Functions
MEMBER FUNCTION get_status_description RETURN VARCHAR2,
MEMBER FUNCTION is_valid_attendance RETURN BOOLEAN,
MEMBER FUNCTION days_since_class RETURN NUMBER
);
/
-- Batch_Type Body
CREATE OR REPLACE TYPE BODY Batch_Type AS
-- Member Function to Get Batch Duration
MEMBER FUNCTION get_batch_duration RETURN NUMBER IS
BEGIN
RETURN End_Year - Start_Year + 1;
END get_batch_duration;
-- Course_Type Body
CREATE OR REPLACE TYPE BODY Course_Type AS
-- Member Function to Calculate Estimated Study Time
MEMBER FUNCTION calculate_study_hours RETURN NUMBER IS
BEGIN
-- Assume 3 hours of study per credit hour
RETURN Credit_Hours * 3;
END calculate_study_hours;
-- Teacher_Type Body
CREATE OR REPLACE TYPE BODY Teacher_Type AS
-- Member Function to Get Full Name
MEMBER FUNCTION get_full_name RETURN VARCHAR2 IS
BEGIN
RETURN First_Name || ' ' || Last_Name;
END get_full_name;
-- Class_Type Body
CREATE OR REPLACE TYPE BODY Class_Type AS
-- Member Function to Determine Class Type Description
MEMBER FUNCTION get_class_type_description RETURN VARCHAR2 IS
BEGIN
RETURN
CASE Class_Type
WHEN 'Normal' THEN 'Regular Lecture Class'
WHEN 'Exam' THEN 'Examination Class'
ELSE 'Undefined Class Type'
END;
END get_class_type_description;
-- Student_Type Body
CREATE OR REPLACE TYPE BODY Student_Type AS
-- Member Function to Get Full Name
MEMBER FUNCTION get_full_name RETURN VARCHAR2 IS
BEGIN
RETURN First_Name || ' ' || Last_Name;
END get_full_name;
-- Attendance_Record_Type Body
CREATE OR REPLACE TYPE BODY Attendance_Record_Type AS
-- Member Function to Get Attendance Status Description
MEMBER FUNCTION get_status_description RETURN VARCHAR2 IS
BEGIN
RETURN
CASE Status
WHEN 'Present' THEN 'Attended the class'
WHEN 'Absent' THEN 'Missed the class'
WHEN 'Late' THEN 'Arrived late'
ELSE 'Unknown Status'
END;
END get_status_description;
-- Execute Demonstration
BEGIN
demonstrate_type_bodies();
END;
/
-- Insert Teachers
INSERT INTO Teachers VALUES (
Teacher_Type(5001, 'Araba', 'A', '[email protected]')
);
INSERT INTO Teachers VALUES (
Teacher_Type(5002, 'Mohammed', 'R', '[email protected]')
);
INSERT INTO Teachers VALUES (
Teacher_Type(5003, 'Kibru', 'G', '[email protected]')
);
INSERT INTO Teachers VALUES (
Teacher_Type(5004, 'Keno', 'B', '[email protected]')
);
INSERT INTO Teachers VALUES (
Teacher_Type(5005, 'Wogayehu', 'A', '[email protected]')
);
-- Insert Courses
INSERT INTO Courses VALUES (
Course_Type(6001, 'CS101', 'Introduction to Programming', 'Fall', 3)
);
INSERT INTO Courses VALUES (
Course_Type(6002, 'CS201', 'Data Structures and Algorithms', 'Spring', 4)
);
INSERT INTO Courses VALUES (
Course_Type(6017, 'Hist 1012', 'History of Ethiopia and the Horn',
'Spring', 3)
);
INSERT INTO Courses VALUES (
Course_Type(6030, 'Anth1012', 'Social Anthropology', 'Spring', 3)
);
-- Insert Classes
INSERT INTO Classes VALUES (
Class_Type(7001, 6011, 5001, 'I', 2024, 'Normal', TO_DATE('2025-03-06',
'YYYY-MM-DD'))
);
INSERT INTO Classes VALUES (
Class_Type(7015, 6030, 5018, 'II', 2023, 'Normal', TO_DATE('2024-06-19',
'YYYY-MM-DD'))
);
-- Insert Students
INSERT INTO Students VALUES (
Student_Type('1UGPRO417/16', 'Abebe', 'Kebede', 2016,
'[email protected]')
);
INSERT INTO Students VALUES (
Student_Type('UGPR4284/16', 'Tigist', 'Lemma', 2016,
'[email protected]')
);
INSERT INTO Students VALUES (
Student_Type('UGPRO428/16', 'Chala', 'Bekele', 2016,
'[email protected]')
);
COMMIT;
DBMS_OUTPUT.PUT_LINE('Comprehensive sample data inserted successfully');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error inserting sample data: ' || SQLERRM);
ROLLBACK;
RAISE;
END;
/
FOR rec IN (
SELECT
s.Student_ID,
s.get_full_name() AS Student_Name,
c.Course_Name,
a.Attendance_Date,
a.Status,
a.get_status_description() AS Status_Description
FROM
Attendance_Records a
JOIN Students s ON a.Student_ID = s.Student_ID
JOIN Classes cl ON a.Class_ID = cl.Class_ID
JOIN Courses c ON cl.Course_ID = c.Course_ID
ORDER BY
a.Attendance_Date
) LOOP
DBMS_OUTPUT.PUT_LINE(
'Student: ' || rec.Student_Name ||
', Course: ' || rec.Course_Name ||
', Date: ' || TO_CHAR(rec.Attendance_Date, 'YYYY-MM-DD') ||
', Status: ' || rec.Status_Description
);
END LOOP;
END;
/
-- Present Count
SELECT COUNT(*) INTO v_present_count
FROM Attendance_Records
WHERE Status = 'Present';
-- Absent Count
SELECT COUNT(*) INTO v_absent_count
FROM Attendance_Records
WHERE Status = 'Absent';
DBMS_OUTPUT.PUT_LINE('Attendance Analytics');
DBMS_OUTPUT.PUT_LINE('-------------------');
DBMS_OUTPUT.PUT_LINE('Total Students: ' || v_total_students);
DBMS_OUTPUT.PUT_LINE('Total Present Records: ' || v_present_count);
DBMS_OUTPUT.PUT_LINE('Total Absent Records: ' || v_absent_count);
DBMS_OUTPUT.PUT_LINE('Attendance Percentage: ' ||
ROUND((v_present_count / (v_present_count + v_absent_count)) * 100, 2) ||
'%'
);
END;
/
-- Generate Reports
DBMS_OUTPUT.PUT_LINE('Generating Attendance Reports');
DBMS_OUTPUT.PUT_LINE('----------------------------');
generate_attendance_report();
attendance_analytics();
END;
/