0% found this document useful (0 votes)
5 views8 pages

F

The document outlines the creation and management of a database for an educational institution, including user creation, object type definitions, and type body implementations for various entities such as batches, courses, teachers, classes, students, and attendance records. It also includes procedures for inserting sample data, generating attendance reports, and performing attendance analytics. The main execution block demonstrates the insertion of data and the generation of reports.

Uploaded by

teferafeneti85
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
5 views8 pages

F

The document outlines the creation and management of a database for an educational institution, including user creation, object type definitions, and type body implementations for various entities such as batches, courses, teachers, classes, students, and attendance records. It also includes procedures for inserting sample data, generating attendance reports, and performing attendance analytics. The main execution block demonstrates the insertion of data and the generation of reports.

Uploaded by

teferafeneti85
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 8

CONNECT sys/oracle AS SYSDBA;

'CREATE USER HU_CS_ATTENDANCE_ADMIN IDENTIFIED BY "StrongPassword!123"';

-- 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;
/

-- Connect as the new user


CONNECT HU_CS_ATTENDANCE_ADMIN/"StrongPassword!123";

-- Enable Output
SET SERVEROUTPUT ON;

-- Section 2: Object Type Definitions with Enhanced Functionality

-- Batch Object Type


CREATE OR REPLACE TYPE Batch_Type AS OBJECT (
Batch_ID NUMBER,
Start_Year NUMBER,
End_Year NUMBER,
Department VARCHAR2(100),

-- Member Functions
MEMBER FUNCTION get_batch_duration RETURN NUMBER,
MEMBER FUNCTION get_batch_description RETURN VARCHAR2,
MEMBER FUNCTION is_current_batch RETURN BOOLEAN
);
/

-- Course Object Type


CREATE OR REPLACE TYPE Course_Type AS OBJECT (
Course_ID NUMBER,
Course_Code VARCHAR2(20),
Course_Name VARCHAR2(100),
Semester VARCHAR2(20),
Credit_Hours NUMBER,

-- Member Functions
MEMBER FUNCTION calculate_study_hours RETURN NUMBER,
MEMBER FUNCTION get_course_difficulty RETURN VARCHAR2,
MEMBER FUNCTION is_advanced_course RETURN BOOLEAN
);
/

-- Teacher Object Type


CREATE OR REPLACE TYPE Teacher_Type AS OBJECT (
Teacher_ID NUMBER,
First_Name VARCHAR2(50),
Last_Name VARCHAR2(50),
Email VARCHAR2(100),

-- Member Functions
MEMBER FUNCTION get_full_name RETURN VARCHAR2,
MEMBER FUNCTION get_email_domain RETURN VARCHAR2,
MEMBER FUNCTION is_valid_email RETURN BOOLEAN
);
/

-- Class Object Type


CREATE OR REPLACE TYPE Class_Type AS OBJECT (
Class_ID NUMBER,
Course_ID NUMBER,
Teacher_ID NUMBER,
Semester VARCHAR2(20),
Academic_Year NUMBER,
Class_Type VARCHAR2(20),
Class_Date DATE,

-- Member Functions
MEMBER FUNCTION get_class_type_description RETURN VARCHAR2,
MEMBER FUNCTION get_semester_description RETURN VARCHAR2,
MEMBER FUNCTION is_exam_class RETURN BOOLEAN
);
/

-- Student Object Type


CREATE OR REPLACE TYPE Student_Type AS OBJECT (
Student_ID VARCHAR2(20),
First_Name VARCHAR2(50),
Last_Name VARCHAR2(50),
Batch_ID NUMBER,
Email VARCHAR2(100),

-- Member Functions
MEMBER FUNCTION get_full_name RETURN VARCHAR2,
MEMBER FUNCTION get_email_username RETURN VARCHAR2,
MEMBER FUNCTION is_current_student RETURN BOOLEAN
);
/

-- Attendance Record Object Type


CREATE OR REPLACE TYPE Attendance_Record_Type AS OBJECT (
Attendance_ID NUMBER,
Student_ID VARCHAR2(20),
Class_ID NUMBER,
Attendance_Date DATE,
Status VARCHAR2(20),
Remarks VARCHAR2(200),

-- Member Functions
MEMBER FUNCTION get_status_description RETURN VARCHAR2,
MEMBER FUNCTION is_valid_attendance RETURN BOOLEAN,
MEMBER FUNCTION days_since_class RETURN NUMBER
);
/

-- Section 3: Type Bodies Implementation


-- Add Type Bodies for Object Types

-- 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;

-- Member Function to Get Batch Description


MEMBER FUNCTION get_batch_description RETURN VARCHAR2 IS
BEGIN
RETURN Department || ' Batch ' || Start_Year || '-' || End_Year;
END get_batch_description;
END;
/

-- 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;

-- Member Function to Get Course Difficulty


MEMBER FUNCTION get_course_difficulty RETURN VARCHAR2 IS
BEGIN
CASE
WHEN Credit_Hours <= 2 THEN RETURN 'Introductory';
WHEN Credit_Hours BETWEEN 3 AND 4 THEN RETURN 'Intermediate';
ELSE RETURN 'Advanced';
END CASE;
END get_course_difficulty;
END;
/

-- 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;

-- Member Function to Get Email Domain


MEMBER FUNCTION get_email_domain RETURN VARCHAR2 IS
BEGIN
RETURN SUBSTR(Email, INSTR(Email, '@') + 1);
END get_email_domain;
END;
/

-- 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;

-- Member Function to Get Semester Description


MEMBER FUNCTION get_semester_description RETURN VARCHAR2 IS
BEGIN
RETURN Semester || ' ' || Academic_Year;
END get_semester_description;
END;
/

-- 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;

-- Member Function to Get Email Username


MEMBER FUNCTION get_email_username RETURN VARCHAR2 IS
BEGIN
RETURN SUBSTR(Email, 1, INSTR(Email, '@') - 1);
END get_email_username;
END;
/

-- 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;

-- Member Function to Check if Attendance is Valid


MEMBER FUNCTION is_valid_attendance RETURN BOOLEAN IS
BEGIN
RETURN
Status IN ('Present', 'Absent', 'Late') AND
Attendance_Date IS NOT NULL;
END is_valid_attendance;
END;
/

-- Demonstration Procedure to Show Type Body Functionality


CREATE OR REPLACE PROCEDURE demonstrate_type_bodies IS
-- Declare variables for each type
v_batch Batch_Type;
v_course Course_Type;
v_teacher Teacher_Type;
v_class Class_Type;
v_student Student_Type;
v_attendance Attendance_Record_Type;
BEGIN
DBMS_OUTPUT.PUT_LINE('Type Bodies Demonstration:');
DBMS_OUTPUT.PUT_LINE('------------------------');

-- Batch Type Demo


v_batch := Batch_Type(1, 2020, 2024, 'Computer Science');
DBMS_OUTPUT.PUT_LINE('Batch Description: ' || v_batch.get_batch_description());
DBMS_OUTPUT.PUT_LINE('Batch Duration: ' || v_batch.get_batch_duration() || '
years');

-- Course Type Demo


v_course := Course_Type(1, 'CS101', 'Introduction to Programming', 'Fall', 3);
DBMS_OUTPUT.PUT_LINE('Course Difficulty: ' ||
v_course.get_course_difficulty());
DBMS_OUTPUT.PUT_LINE('Estimated Study Hours: ' ||
v_course.calculate_study_hours());

-- Teacher Type Demo


v_teacher := Teacher_Type(101, 'John', 'Doe', '[email protected]');
DBMS_OUTPUT.PUT_LINE('Teacher Full Name: ' || v_teacher.get_full_name());
DBMS_OUTPUT.PUT_LINE('Email Domain: ' || v_teacher.get_email_domain());

-- Class Type Demo


v_class := Class_Type(1, 1, 101, 'Fall', 2023, 'Normal', SYSDATE);
DBMS_OUTPUT.PUT_LINE('Class Type Description: ' ||
v_class.get_class_type_description());
DBMS_OUTPUT.PUT_LINE('Semester Description: ' ||
v_class.get_semester_description());

-- Student Type Demo


v_student := Student_Type('CS2020001', 'Abebe', 'Kebede', 1,
'[email protected]');
DBMS_OUTPUT.PUT_LINE('Student Full Name: ' || v_student.get_full_name());
DBMS_OUTPUT.PUT_LINE('Email Username: ' || v_student.get_email_username());

-- Attendance Record Type Demo


v_attendance := Attendance_Record_Type(1, 'CS2020001', 1, SYSDATE, 'Present',
'Participated actively');
DBMS_OUTPUT.PUT_LINE('Attendance Status: ' ||
v_attendance.get_status_description());
DBMS_OUTPUT.PUT_LINE('Is Valid Attendance: ' ||
CASE WHEN v_attendance.is_valid_attendance() THEN 'Yes' ELSE 'No' END);
END;
/

-- Execute Demonstration
BEGIN
demonstrate_type_bodies();
END;
/

-- Section 4: Table Creation


CREATE TABLE Batches OF Batch_Type (PRIMARY KEY (Batch_ID));
CREATE TABLE Courses OF Course_Type (PRIMARY KEY (Course_ID));
CREATE TABLE Teachers OF Teacher_Type (PRIMARY KEY (Teacher_ID));
CREATE TABLE Classes OF Class_Type (PRIMARY KEY (Class_ID));
CREATE TABLE Students OF Student_Type (PRIMARY KEY (Student_ID));
CREATE TABLE Attendance_Records OF Attendance_Record_Type (PRIMARY KEY
(Attendance_ID));

-- Section 5: Data Insertion Procedure


CREATE OR REPLACE PROCEDURE insert_comprehensive_sample_data IS
BEGIN

CREATE OR REPLACE PROCEDURE insert_comprehensive_sample_data IS


BEGIN
-- Insert Batches
INSERT INTO Batches VALUES (
Batch_Type(2013, 2013, 2017, 'Computer Science')
);
INSERT INTO Batches VALUES (
Batch_Type(2014, 2014, 2018, 'Computer Science')
);
INSERT INTO Batches VALUES (
Batch_Type(2015, 2015, 2019, 'Computer Science')
);
INSERT INTO Batches VALUES (
Batch_Type(2016, 2016, 2020, 'Computer Science')
);

-- 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]')
);

-- Insert Attendance Records


INSERT INTO Attendance_Records VALUES (
Attendance_Record_Type(8001, '1UGPRO417/16', 7001, TO_DATE('2025-03-06',
'YYYY-MM-DD'), 'Present', 'Attended class')
);
INSERT INTO Attendance_Records VALUES (
Attendance_Record_Type(8002, 'UGPRO428/16', 7015, TO_DATE('2024-06-19',
'YYYY-MM-DD'), 'Present', 'Participated actively')
);

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;
/

-- Section 6: Reporting and Analysis Procedures


CREATE OR REPLACE PROCEDURE generate_attendance_report IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Comprehensive Attendance Report');
DBMS_OUTPUT.PUT_LINE('------------------------------');

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;
/

-- Section 7: Advanced Analytics Procedure


CREATE OR REPLACE PROCEDURE attendance_analytics IS
v_total_students NUMBER;
v_present_count NUMBER;
v_absent_count NUMBER;
BEGIN
-- Total Students
SELECT COUNT(DISTINCT Student_ID) INTO v_total_students FROM Students;

-- 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;
/

-- Section 8: Main Execution Block


BEGIN
-- Insert Sample Data
insert_comprehensive_sample_data();

-- Generate Reports
DBMS_OUTPUT.PUT_LINE('Generating Attendance Reports');
DBMS_OUTPUT.PUT_LINE('----------------------------');

generate_attendance_report();
attendance_analytics();
END;
/

You might also like