Untitled
unknown
plain_text
a month ago
4.6 kB
5
Indexable
-- TRIGGER 11: Trigger before inserting a row into Employee table CREATE OR REPLACE TRIGGER before_insert_employee BEFORE INSERT ON employee FOR EACH ROW BEGIN DBMS_OUTPUT.PUT_LINE('New employee ' || :NEW.employee_name || ' is being added.'); END; / -- PACKAGE SPECIFICATION CREATE OR REPLACE PACKAGE School_api AS PROCEDURE Get_name_address( p_table_name VARCHAR2, p_id NUMBER, p_first_name OUT VARCHAR2, p_last_name OUT VARCHAR2, p_street OUT VARCHAR2, p_city OUT VARCHAR2, p_state OUT VARCHAR2, p_zip OUT VARCHAR2 ); FUNCTION Instructor_status(p_instructor_id NUMBER) RETURN VARCHAR2; PROCEDURE remove_student(p_student_id NUMBER, p_ri VARCHAR2 DEFAULT 'R'); END School_api; / -- PACKAGE BODY CREATE OR REPLACE PACKAGE BODY School_api AS -- PROCEDURE: Get_name_address PROCEDURE Get_name_address( p_table_name VARCHAR2, p_id NUMBER, p_first_name OUT VARCHAR2, p_last_name OUT VARCHAR2, p_street OUT VARCHAR2, p_city OUT VARCHAR2, p_state OUT VARCHAR2, p_zip OUT VARCHAR2 ) AS v_sql VARCHAR2(1000); BEGIN v_sql := 'SELECT first_name, last_name, street, city, state, zip FROM ' || p_table_name || ' WHERE id = :1'; EXECUTE IMMEDIATE v_sql INTO p_first_name, p_last_name, p_street, p_city, p_state, p_zip USING p_id; END Get_name_address; -- FUNCTION: Instructor_status FUNCTION Instructor_status(p_instructor_id NUMBER) RETURN VARCHAR2 AS v_count NUMBER; BEGIN SELECT COUNT(*) INTO v_count FROM sections WHERE instructor_id = p_instructor_id; IF v_count >= 3 THEN RETURN 'Instructor needs a vacation!'; ELSE RETURN 'Instructor is teaching ' || v_count || ' sections.'; END IF; END Instructor_status; -- PROCEDURE: Remove Student PROCEDURE remove_student(p_student_id NUMBER, p_ri VARCHAR2 DEFAULT 'R') AS v_count NUMBER; BEGIN -- Check enrollments for DELETE RESTRICT IF p_ri = 'R' THEN SELECT COUNT(*) INTO v_count FROM enrollments WHERE student_id = p_student_id; IF v_count > 0 THEN RAISE_APPLICATION_ERROR(-20001, 'Cannot delete student with enrollments.'); END IF; ELSIF p_ri = 'C' THEN -- Perform DELETE CASCADE DELETE FROM enrollments WHERE student_id = p_student_id; DELETE FROM payments WHERE student_id = p_student_id; ELSE RAISE_APPLICATION_ERROR(-20002, 'Invalid option. Use R (Restrict) or C (Cascade).'); END IF; -- Delete the student DELETE FROM students WHERE student_id = p_student_id; COMMIT; END remove_student; END School_api; / -- TESTING THE PACKAGE DECLARE v_first_name VARCHAR2(50); v_last_name VARCHAR2(50); v_street VARCHAR2(100); v_city VARCHAR2(50); v_state VARCHAR2(50); v_zip VARCHAR2(10); v_status VARCHAR2(100); BEGIN -- Get Name and Address of a Student or Instructor School_api.Get_name_address('students', 101, v_first_name, v_last_name, v_street, v_city, v_state, v_zip); DBMS_OUTPUT.PUT_LINE('Name: ' || v_first_name || ' ' || v_last_name); DBMS_OUTPUT.PUT_LINE('Address: ' || v_street || ', ' || v_city || ', ' || v_state || ' - ' || v_zip); -- Get Instructor Status v_status := School_api.Instructor_status(202); DBMS_OUTPUT.PUT_LINE(v_status); -- Remove a Student (Use 'R' for Restrict, 'C' for Cascade) -- School_api.remove_student(105, 'R'); -- Restrict Delete -- School_api.remove_student(105, 'C'); -- Cascade Delete END; / -- LOBs: Storing and Retrieving Large Objects DECLARE v_file BLOB; v_text CLOB; BEGIN -- Storing a BLOB (Binary Large Object) SELECT document INTO v_file FROM documents WHERE doc_id = 1; -- Storing a CLOB (Character Large Object) SELECT notes INTO v_text FROM student_notes WHERE student_id = 101; DBMS_OUTPUT.PUT_LINE('LOBs Retrieved Successfully.'); END; / -- TRANSACTION PROCESSING EXAMPLES BEGIN SAVEPOINT start_trans; -- Example INSERT operation INSERT INTO students (student_id, first_name, last_name, department) VALUES (110, 'John', 'Doe', 'CS'); -- Example UPDATE operation UPDATE students SET department = 'Math' WHERE student_id = 110; -- Commit transaction COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK TO start_trans; DBMS_OUTPUT.PUT_LINE('Transaction failed, changes rolled back.'); END; /
Editor is loading...
Leave a Comment