0% found this document useful (0 votes)
23 views5 pages

PL SQL

De

Uploaded by

Yassine Jlassi
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)
23 views5 pages

PL SQL

De

Uploaded by

Yassine Jlassi
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/ 5

-- Define types

CREATE TYPE PersonType AS OBJECT (


id VARCHAR2(50),
name VARCHAR2(100),
age NUMBER
) NOT FINAL;
/

CREATE TYPE StudentType UNDER PersonType NOT FINAL (


grade NUMBER
) OVERRIDING;
/

CREATE TYPE TeacherType UNDER PersonType NOT FINAL (


subjectTaught VARCHAR2(100),
yearsOfExperience NUMBER
) OVERRIDING;
/

CREATE TYPE EnrollmentType AS OBJECT (


student REF StudentType ORDER BY id,
teacher REF TeacherType ORDER BY id
);
/

-- Create tables for Person, Student, Teacher, and Enrollment


CREATE TABLE PersonTable OF PersonType (
PRIMARY KEY (id)
);

CREATE TABLE StudentTable OF StudentType (


PRIMARY KEY (id),
CONSTRAINT student_fk FOREIGN KEY (id) REFERENCES PersonTable
);

CREATE TABLE TeacherTable OF TeacherType (


PRIMARY KEY (id),
CONSTRAINT teacher_fk FOREIGN KEY (id) REFERENCES PersonTable
);

CREATE TABLE EnrollmentTable OF EnrollmentType (


student REF StudentType SCOPE IS StudentTable,
teacher REF TeacherType SCOPE IS TeacherTable
);

-- Create views for Student and Teacher


CREATE VIEW StudentView AS
SELECT *
FROM PersonTable
WHERE TREAT(VALUE(p) AS StudentType) IS NOT NULL;

CREATE VIEW TeacherView AS


SELECT *
FROM PersonTable
WHERE TREAT(VALUE(p) AS TeacherType) IS NOT NULL;

-- INSTEAD OF INSERT trigger for StudentView


CREATE OR REPLACE TRIGGER StudentView_Insert
INSTEAD OF INSERT ON StudentView
FOR EACH ROW
DECLARE
BEGIN
INSERT INTO StudentTable VALUES
(StudentType(:NEW.id, :NEW.name, :NEW.age, :NEW.grade));
END;
/

-- INSTEAD OF INSERT trigger for TeacherView


CREATE OR REPLACE TRIGGER TeacherView_Insert
INSTEAD OF INSERT ON TeacherView
FOR EACH ROW
DECLARE
BEGIN
INSERT INTO TeacherTable VALUES
(TeacherType(:NEW.id, :NEW.name, :NEW.age, :NEW.subjectTaught, :NEW.yearsOfExperien
ce));
END;
/

-- CRUD procedures for Person


-- Create Person
CREATE OR REPLACE PROCEDURE createPerson (
p_id VARCHAR2,
p_name VARCHAR2,
p_age NUMBER
) AS
BEGIN
INSERT INTO PersonTable VALUES (PersonType(p_id, p_name, p_age));
END createPerson;
/

-- Read Person
CREATE OR REPLACE PROCEDURE readPerson (p_id VARCHAR2) AS
personObj PersonType;
BEGIN
SELECT * INTO personObj FROM PersonTable WHERE id = p_id;
DBMS_OUTPUT.PUT_LINE('ID: ' || personObj.id);
DBMS_OUTPUT.PUT_LINE('Name: ' || personObj.name);
DBMS_OUTPUT.PUT_LINE('Age: ' || personObj.age);
END readPerson;
/

-- Update Person
CREATE OR REPLACE PROCEDURE updatePersonAge (
p_id VARCHAR2,
p_new_age NUMBER
) AS
BEGIN
UPDATE PersonTable SET age = p_new_age WHERE id = p_id;
END updatePersonAge;
/

-- Delete Person
CREATE OR REPLACE PROCEDURE deletePerson (p_id VARCHAR2) AS
BEGIN
DELETE FROM PersonTable WHERE id = p_id;
END deletePerson;
/
-- CRUD procedures for Student
-- Create Student
CREATE OR REPLACE PROCEDURE createStudent (
s_id VARCHAR2,
s_name VARCHAR2,
s_age NUMBER,
s_grade NUMBER
) AS
BEGIN
INSERT INTO StudentTable VALUES (StudentType(s_id, s_name, s_age, s_grade));
END createStudent;
/

-- Read Student
CREATE OR REPLACE PROCEDURE readStudent (s_id VARCHAR2) AS
studentObj StudentType;
BEGIN
SELECT * INTO studentObj FROM StudentTable WHERE id = s_id;
DBMS_OUTPUT.PUT_LINE('ID: ' || studentObj.id);
DBMS_OUTPUT.PUT_LINE('Name: ' || studentObj.name);
DBMS_OUTPUT.PUT_LINE('Age: ' || studentObj.age);
DBMS_OUTPUT.PUT_LINE('Grade: ' || studentObj.grade);
END readStudent;
/

-- Update Student
CREATE OR REPLACE PROCEDURE updateStudentGrade (
s_id VARCHAR2,
s_new_grade NUMBER
) AS
BEGIN
UPDATE StudentTable SET grade = s_new_grade WHERE id = s_id;
END updateStudentGrade;
/

-- Delete Student
CREATE OR REPLACE PROCEDURE deleteStudent (s_id VARCHAR2) AS
BEGIN
DELETE FROM StudentTable WHERE id = s_id;
END deleteStudent;
/

-- CRUD procedures for Teacher


-- Create Teacher
CREATE OR REPLACE PROCEDURE createTeacher (
t_id VARCHAR2,
t_name VARCHAR2,
t_age NUMBER,
t_subjectTaught VARCHAR2,
t_yearsOfExperience NUMBER
) AS
BEGIN
INSERT INTO TeacherTable VALUES (TeacherType(t_id, t_name, t_age,
t_subjectTaught, t_yearsOfExperience));
END createTeacher;
/

-- Read Teacher
CREATE OR REPLACE PROCEDURE readTeacher (t_id VARCHAR2) AS
teacherObj TeacherType;
BEGIN
SELECT * INTO teacherObj FROM TeacherTable WHERE id = t_id;
DBMS_OUTPUT.PUT_LINE('ID: ' || teacherObj.id);
DBMS_OUTPUT.PUT_LINE('Name: ' || teacherObj.name);
DBMS_OUTPUT.PUT_LINE('Age: ' || teacherObj.age);
DBMS_OUTPUT.PUT_LINE('Subject Taught: ' || teacherObj.subjectTaught);
DBMS_OUTPUT.PUT_LINE('Years of Experience: ' || teacherObj.yearsOfExperience);
END readTeacher;
/

-- Update Teacher
CREATE OR REPLACE PROCEDURE updateTeacherExperience (
t_id VARCHAR2,
t_new_experience NUMBER
) AS
BEGIN
UPDATE TeacherTable SET yearsOfExperience = t_new_experience WHERE id = t_id;
END updateTeacherExperience;
/

-- Delete Teacher
CREATE OR REPLACE PROCEDURE deleteTeacher (t_id VARCHAR2) AS
BEGIN
DELETE FROM TeacherTable WHERE id = t_id;
END deleteTeacher;
/

-- CRUD procedures for Enrollment


-- Create Enrollment
CREATE OR REPLACE PROCEDURE createEnrollment (
student_id VARCHAR2,
teacher_id VARCHAR2
) AS
studentRef REF StudentType;
teacherRef REF TeacherType;
enrollmentObj EnrollmentType;
BEGIN
SELECT REF(s) INTO studentRef FROM StudentTable s WHERE s.id = student_id;
SELECT REF(t) INTO teacherRef FROM TeacherTable t WHERE t.id = teacher_id;

enrollmentObj := EnrollmentType(studentRef, teacherRef);


INSERT INTO EnrollmentTable VALUES (enrollmentObj);
END createEnrollment;
/

-- Read Enrollment
CREATE OR REPLACE PROCEDURE readEnrollment AS
CURSOR enrollment_cursor IS
SELECT *
FROM EnrollmentTable
ORDER BY student.id, teacher.id; -- Ordering by student and teacher IDs
studentObj StudentType;
teacherObj TeacherType;
BEGIN
FOR enrollment_rec IN enrollment_cursor LOOP
studentObj := TREAT(enrollment_rec.student AS StudentType);
teacherObj := TREAT(enrollment_rec.teacher AS TeacherType);
DBMS_OUTPUT.PUT_LINE('Student ID: ' || studentObj.id);
DBMS_OUTPUT.PUT_LINE('Student Name: ' || studentObj.name);
DBMS_OUTPUT.PUT_LINE('Student Age: ' || studentObj.age);
DBMS_OUTPUT.PUT_LINE('Student Grade: ' || studentObj.grade);

DBMS_OUTPUT.PUT_LINE('Teacher ID: ' || teacherObj.id);


DBMS_OUTPUT.PUT_LINE('Teacher Name: ' || teacherObj.name);
DBMS_OUTPUT.PUT_LINE('Teacher Age: ' || teacherObj.age);
DBMS_OUTPUT.PUT_LINE('Subject Taught: ' || teacherObj.subjectTaught);
DBMS_OUTPUT.PUT_LINE('Years of Experience: ' ||
teacherObj.yearsOfExperience);
END LOOP;
END readEnrollment;
/

-- Delete Enrollment
CREATE OR REPLACE PROCEDURE deleteEnrollment (enrollment_id NUMBER) AS
BEGIN
DELETE FROM EnrollmentTable WHERE rownum = 1;
END deleteEnrollment;
/

You might also like