Files
DBI/Uebungszettel_13.sql
2025-02-27 14:52:09 +01:00

146 lines
3.7 KiB
MySQL

SET SERVEROUTPUT On
-- 13.1
CREATE OR REPLACE PROCEDURE Discount
AS
CURSOR c_group_discount
IS
SELECT distinct s.course_no, c.description
FROM section s, enrollment e, course c
WHERE s.section_id = e.section_id
AND c.course_no = s.course_no
GROUP BY s.course_no, c.description,
e.section_id, s.section_id
HAVING COUNT(*) >=8;
BEGIN
FOR r_group_discount IN c_group_discount LOOP
UPDATE course
SET cost = cost * .95
WHERE course_no = r_group_discount.course_no;
DBMS_OUTPUT.PUT_LINE('A 5% discount has been given to '||
r_group_discount.course_no||' '||r_group_discount.description);
END LOOP;
END;
/
-- a) Es wird eine PROCEDURE namens Discount erstellt
-- b)
BEGIN
Discount;
END;
/
-- c) Commit ist nicht notwendig, da Autocommit an ist
--13.2
CREATE OR REPLACE FUNCTION new_student_id
RETURN student.student_id%TYPE
AS
v_new_id student.student_id%TYPE;
BEGIN
SELECT student_id_seq.NEXTVAL INTO v_new_id FROM dual;
RETURN v_new_id;
END;
/
-- 13.3
-- a)
CREATE OR REPLACE PACKAGE school_api as
PROCEDURE discount;
FUNCTION new_instructor_id
RETURN instructor.instructor_id%TYPE;
END school_api;
/
CREATE OR REPLACE PACKAGE BODY school_api
AS
PROCEDURE discount IS
CURSOR c_group_discount IS
SELECT DISTINCT s.course_no, c.description
FROM section s, enrollment e, course c
WHERE s.section_id = e.section_id
AND c.course_no = s.course_no
GROUP BY s.course_no, c.description,
e.section_id, s.section_id
HAVING COUNT(*) >= 8;
BEGIN
FOR r_group_discount IN c_group_discount LOOP
UPDATE course
SET cost = cost * .95
WHERE course_no = r_group_discount.course_no;
DBMS_OUTPUT.PUT_LINE('A 5% discount has been given to '||
r_group_discount.course_no||' '||r_group_discount.description);
END LOOP;
END discount;
FUNCTION new_instructor_id
RETURN instructor.instructor_id%TYPE IS
v_new_id instructor.instructor_id%TYPE;
BEGIN
SELECT instructor_id_seq.NEXTVAL INTO v_new_id FROM dual;
RETURN v_new_id;
END new_instructor_id;
END school_api;
/
--13.4
DECLARE
v_new_id instructor.instructor_id%TYPE;
BEGIN
v_new_id := school_api.new_instructor_id;
DBMS_OUTPUT.PUT_LINE('New instructor ID: ' || v_new_id);
END;
/
--13.5
CREATE OR REPLACE PACKAGE BODY school_api
AS
PROCEDURE discount IS
CURSOR c_group_discount IS
SELECT DISTINCT s.course_no, c.description
FROM section s, enrollment e, course c
WHERE s.section_id = e.section_id
AND c.course_no = s.course_no
GROUP BY s.course_no, c.description,
e.section_id, s.section_id
HAVING COUNT(*) >= 8;
BEGIN
FOR r_group_discount IN c_group_discount LOOP
UPDATE course
SET cost = cost * .95
WHERE course_no = r_group_discount.course_no;
DBMS_OUTPUT.PUT_LINE('A 5% discount has been given to '||
r_group_discount.course_no||' '||r_group_discount.description);
END LOOP;
END discount;
FUNCTION new_instructor_id
RETURN instructor.instructor_id%TYPE IS
v_new_id instructor.instructor_id%TYPE;
BEGIN
SELECT instructor_id_seq.NEXTVAL INTO v_new_id FROM dual;
RETURN v_new_id;
END new_instructor_id;
FUNCTION get_course_descript_private (
p_course_no course.course_no%TYPE
) RETURN course.description%TYPE IS
v_description course.description%TYPE;
BEGIN
SELECT description INTO v_description
FROM course
WHERE course_no = p_course_no;
RETURN v_description;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN NULL;
END get_course_descript_private;
END school_api;
/