diff --git a/uebungszettel_4.sql b/uebungszettel_4.sql new file mode 100644 index 0000000..683f600 --- /dev/null +++ b/uebungszettel_4.sql @@ -0,0 +1,259 @@ +--4.1) +--a) +CREATE TABLE UEBUNG4 ( + ID NUMBER, + NAME VARCHAR2(20) +); +--b) +CREATE SEQUENCE UEBUNG4_SEQ +START WITH 1 +INCREMENT BY 5; +--c) +DECLARE + v_name VARCHAR2(20); + v_id NUMBER; +BEGIN + -- Insert the student with the most enrollments + INSERT INTO UEBUNG4 (ID, NAME) + SELECT UEBUNG4_SEQ.NEXTVAL, NAME + FROM students + WHERE enrollments = (SELECT MAX(enrollments) FROM students); + DBMS_OUTPUT.PUT_LINE('Inserted student with most enrollments'); + SAVEPOINT A; + + -- Insert the student with the fewest enrollments + INSERT INTO UEBUNG4 (ID, NAME) + SELECT UEBUNG4_SEQ.NEXTVAL, NAME + FROM students + WHERE enrollments = (SELECT MIN(enrollments) FROM students); + DBMS_OUTPUT.PUT_LINE('Inserted student with fewest enrollments'); + SAVEPOINT B; + + -- Insert the instructor with the most courses + INSERT INTO UEBUNG4 (ID, NAME) + SELECT UEBUNG4_SEQ.NEXTVAL, NAME + FROM instructors + WHERE courses = (SELECT MAX(courses) FROM instructors); + DBMS_OUTPUT.PUT_LINE('Inserted instructor with most courses'); + SAVEPOINT C; + + -- Store the ID of the inserted instructor + SELECT ID INTO v_id + FROM UEBUNG4 + WHERE NAME = (SELECT NAME FROM instructors WHERE courses = (SELECT MAX(courses) FROM instructors)); + DBMS_OUTPUT.PUT_LINE('Stored ID of instructor with most courses: ' || v_id); + + -- Rollback the insertion of the instructor with the most courses + ROLLBACK TO SAVEPOINT C; + DBMS_OUTPUT.PUT_LINE('Rolled back insertion of instructor with most courses'); + + -- Insert the instructor with the fewest courses using v_id + INSERT INTO UEBUNG4 (ID, NAME) + SELECT v_id, NAME + FROM instructors + WHERE courses = (SELECT MIN(courses) FROM instructors); + DBMS_OUTPUT.PUT_LINE('Inserted instructor with fewest courses using stored ID'); + + -- Insert the instructor with the most courses using the sequence + INSERT INTO UEBUNG4 (ID, NAME) + SELECT UEBUNG4_SEQ.NEXTVAL, NAME + FROM instructors + WHERE courses = (SELECT MAX(courses) FROM instructors); + DBMS_OUTPUT.PUT_LINE('Inserted instructor with most courses using sequence ID'); + + COMMIT; +END; +/ +--4.2) +DECLARE + v_date DATE := TO_DATE('&sv_user_date ' , 'DD-MM-YYYY' ) ; + v_day VARCHAR2( 15 ) ; +BEGIN + v_day := RTRIM(TO_CHAR( v_date , 'DAY' ) ) ; + IF v_day IN ( 'SATURDAY' , 'SUNDAY') THEN + DBMS_OUTPUT. PUT_LINE ( v_date||' falls on weekend'); + END IF; + --control resumes here + DBMS_OUTPUT. PUT_LINE ( 'Done . . . ' ) ; +END; +/ +-- For 14.10.2023 +DECLARE + v_date DATE := TO_DATE('14-10-2023', 'DD-MM-YYYY'); + v_day VARCHAR2(15); +BEGIN + v_day := RTRIM(TO_CHAR(v_date, 'DAY')); + IF v_day IN ('SATURDAY', 'SUNDAY') THEN + DBMS_OUTPUT.PUT_LINE(v_date || ' falls on weekend'); + END IF; + DBMS_OUTPUT.PUT_LINE('Done...'); +END; +/ + +-- For 16.10.2023 +DECLARE + v_date DATE := TO_DATE('16-10-2023', 'DD-MM-YYYY'); + v_day VARCHAR2(15); +BEGIN + v_day := RTRIM(TO_CHAR(v_date, 'DAY')); + IF v_day IN ('SATURDAY', 'SUNDAY') THEN + DBMS_OUTPUT.PUT_LINE(v_date || ' falls on weekend'); + END IF; + DBMS_OUTPUT.PUT_LINE('Done . . .'); +END; +/ +--Remove RTRIM +DECLARE + v_date DATE := TO_DATE('14-10-2023', 'DD-MM-YYYY'); + v_day VARCHAR2(15); +BEGIN + v_day := TO_CHAR(v_date, 'DAY'); + DBMS_OUTPUT.PUT_LINE(v_day); + IF v_day IN ('SATURDAY', 'SUNDAY') THEN + DBMS_OUTPUT.PUT_LINE(v_date || ' falls on weekend'); + END IF; + DBMS_OUTPUT.PUT_LINE('Done . . .'); +END; +/ +--Rewrite using LIKE +DECLARE + v_date DATE := TO_DATE('&sv_user_date', 'DD-MM-YYYY'); + v_day VARCHAR2(15); +BEGIN + v_day := RTRIM(TO_CHAR(v_date, 'DAY')); + DBMS_OUTPUT.PUT_LINE(v_day); + IF v_day LIKE 'SATURDAY%' OR v_day LIKE 'SUNDAY%' THEN + DBMS_OUTPUT.PUT_LINE(v_date || ' falls on weekend'); + END IF; + DBMS_OUTPUT.PUT_LINE('Done . . .'); +END; +/ +--Rewrite using if-else +DECLARE + v_date DATE := TO_DATE('&sv_user_date', 'DD-MM-YYYY'); + v_day VARCHAR2(15); +BEGIN + v_day := RTRIM(TO_CHAR(v_date, 'DAY')); + IF v_day LIKE 'SATURDAY%' OR v_day LIKE 'SUNDAY%' THEN + DBMS_OUTPUT.PUT_LINE(v_date || ' falls on weekend'); + ELSE + DBMS_OUTPUT.PUT_LINE(v_date || ' does not fall on weekend'); + END IF; + DBMS_OUTPUT.PUT_LINE('Done . . .'); +END; +/ +--rewrite using SYSDATE +DECLARE + v_date DATE := SYSDATE; + v_day VARCHAR2(15); + v_time VARCHAR2(15); +BEGIN + v_day := RTRIM(TO_CHAR(v_date, 'DAY')); + v_time := TO_CHAR(v_date, 'HH24:MI'); + IF v_day LIKE 'SATURDAY%' OR v_day LIKE 'SUNDAY%' THEN + IF TO_NUMBER(TO_CHAR(v_date, 'HH24')) < 12 THEN + DBMS_OUTPUT.PUT_LINE(v_date || ' falls on weekend in the morning'); + ELSE + DBMS_OUTPUT.PUT_LINE(v_date || ' falls on weekend in the afternoon'); + END IF; + ELSE + DBMS_OUTPUT.PUT_LINE(v_date || ' does not fall on weekend'); + END IF; + DBMS_OUTPUT.PUT_LINE('Done . . .'); +END; +/ +--4.3) +DECLARE + v_instructor_id NUMBER; + v_section_count NUMBER; +BEGIN + -- Prompt the user to input the instructor ID + v_instructor_id := &instructor_id; + + -- Query to count the number of sections taught by the instructor + SELECT COUNT(*) + INTO v_section_count + FROM sections + WHERE instructor_id = v_instructor_id; + + -- Check if the number of sections is greater than 3 + IF v_section_count > 3 THEN + DBMS_OUTPUT.PUT_LINE('Instructor ' || v_instructor_id || ' needs a vacation'); + ELSE + DBMS_OUTPUT.PUT_LINE('Instructor ' || v_instructor_id || ' teaches ' || v_section_count || ' sections'); + END IF; +END; +/ +--Aufgabe 4.4 +--Block 1 +DECLARE + v_num NUMBER; +BEGIN + IF v_num > 0 THEN + DBMS_OUTPUT.PUT_LINE('v_num is greater than 0'); + ELSE + DBMS_OUTPUT.PUT_LINE('v_num is not greater than 0'); + END IF; +END; +/ +--Block 2 +DECLARE + v_num NUMBER; +BEGIN + IF v_num > 0 THEN + DBMS_OUTPUT.PUT_LINE('v_num is greater than 0'); + END IF; + IF NOT (v_num > 0) THEN + DBMS_OUTPUT.PUT_LINE('v_num is not greater than 0'); + END IF; +END; +/ + +--Aufgabe 4.5 +DECLARE + v_date DATE := SYSDATE; + v_day VARCHAR2(15); + v_time VARCHAR2(15); +BEGIN + v_day := RTRIM(TO_CHAR(v_date, 'DAY')); + v_time := TO_CHAR(v_date, 'HH24:MI'); + + CASE + WHEN v_day LIKE 'SATURDAY%' OR v_day LIKE 'SUNDAY%' THEN + CASE + WHEN TO_NUMBER(TO_CHAR(v_date, 'HH24')) < 12 THEN + DBMS_OUTPUT.PUT_LINE(v_date || ' falls on weekend in the morning'); + ELSE + DBMS_OUTPUT.PUT_LINE(v_date || ' falls on weekend in the afternoon'); + END CASE; + ELSE + DBMS_OUTPUT.PUT_LINE(v_date || ' does not fall on weekend'); + END CASE; + + DBMS_OUTPUT.PUT_LINE('Done . . .'); +END; +/ + +--Aufgabe 4.6 +DECLARE + v_instructor_id NUMBER; + v_section_count NUMBER; +BEGIN + -- Prompt the user to input the instructor ID + v_instructor_id := &instructor_id; + + -- Query to count the number of sections taught by the instructor + SELECT COUNT(*) + INTO v_section_count + FROM sections + WHERE instructor_id = v_instructor_id; + + -- Use a CASE statement to determine the output message + CASE + WHEN v_section_count > 3 THEN + DBMS_OUTPUT.PUT_LINE('Instructor ' || v_instructor_id || ' needs a vacation'); + ELSE + DBMS_OUTPUT.PUT_LINE('Instructor ' || v_instructor_id || ' teaches ' || v_section_count || ' sections'); + END CASE; +END; +/ \ No newline at end of file