From d47add691b9b63a315ceac70c57f23ede2b2e5cd Mon Sep 17 00:00:00 2001 From: Tim Kainz Date: Sat, 17 May 2025 13:29:06 +0200 Subject: [PATCH] =?UTF-8?q?added=20=C3=9CZ=2014?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Uebungszettel_14.sql | 59 +++++++++++++++++++++++++++++++ plfprep.sql | 83 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 Uebungszettel_14.sql create mode 100644 plfprep.sql diff --git a/Uebungszettel_14.sql b/Uebungszettel_14.sql new file mode 100644 index 0000000..59b7c9a --- /dev/null +++ b/Uebungszettel_14.sql @@ -0,0 +1,59 @@ +SET SERVEROUTPUT ON; + +Drop table IdVal; + +CREATE TABLE IdVal ( + id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY , + val NUMBER(3) +); + +DECLARE + v_count NUMBER := 300; + v_num NUMBER := 1; +BEGIN + + FOR a IN 0..900 LOOP + IF a >= v_count THEN + v_count := v_count + 300; + v_num := v_num + 1; + END IF; + + Insert into IdVal (val) values (v_num); + END LOOP; +END; +/ + +CREATE OR REPLACE PACKAGE delete_counter +AS + v_oldTable NUMBER; + v_newTable NUMBER; +END delete_counter; +/ + +CREATE OR REPLACE TRIGGER delete_trigger_before +BEFORE DELETE +ON IdVal +BEGIN + SELECT COUNT(*) INTO delete_counter.v_oldTable + FROM IdVal; +END delete_trigger_before; +/ + +CREATE OR REPLACE TRIGGER delete_trigger_after +AFTER DELETE +ON IdVal +BEGIN + SELECT COUNT(*) INTO delete_counter.v_newTable + FROM IdVal; + + DBMS_OUTPUT.PUT_LINE('NEW: '||delete_counter.v_newTable); + DBMS_OUTPUT.PUT_LINE('OLD: '||delete_counter.v_oldTable); + + IF delete_counter.v_newTable < (delete_counter.v_oldTable/2) THEN + Raise_Application_error(-20001, 'TOOO mUch DelEteED!?='); + END IF; +END delete_trigger_after; +/ + + +DELETE FROM IdVal WHERE ROWNUM < 500; \ No newline at end of file diff --git a/plfprep.sql b/plfprep.sql new file mode 100644 index 0000000..7ea6c86 --- /dev/null +++ b/plfprep.sql @@ -0,0 +1,83 @@ +Create or replace Package manage_students +Is + Procedure display_student_count; + Procedure find_student_name + (i_student_id In student.id%Type, + o_last_name Out student.last_name%Type, + o_first_name Out student.first_name%Type); + Function id_is_good + (i_student_id In student.id%Type) + Return Boolean; +Begin +End manage_students; + +Create or replace Package Body manage_students +Is + Procedure display_student_count + Is + v_count Integer; + Begin + select Count(*) + Into v_count + From student; + dbms(v_count); + End display_student_count; + + Procedure find_student_name + (i_student_id In student.id%Type, + o_last_name Out student.last_name%Type, + o_first_name Out student.first_name%Type) + Is + Begin + select first_name, last_name + Into o_first_name, o_last_name + From student + Where i_student_id = student_id; + End find_student_name; + + Function id_is_good + (i_student_id In student.id%Type) + Return Boolean + Is + v_count Integer; + Begin + Select Count(*) + Into v_count + From student; + Return Count=1; + Exception + When others Then + Return False; + End id_is_good; +Begin +End manage_students; + +Create or replace Trigger student_bi +Before Insert on student +For each Row +Begin + -- :New.student_id := sequence_student.NextVal; + :New.created_By := User; + :New.created_Date := Sysdate; + if(TRUE<>manage_students.id_is_good(:New.student_id)) Then + Raise_Application_Error(-20000, 'Id already in Use'); + Endif; +End student_bi; +Create Or replace Trigger student_ai +After Insert On student +Begin + Insert Into protocol (t_table, t_action, t_date) + Values('student', 'insert', Sysdate); +End student_ai; + + +Declare + Cursor c_students (v_student_Id student.id%type) + Is + Select * From student + Where student_id = v_student_Id; +Begin + For v_student In c_students(1) Loop + dbms(v_student.first_name); + End Loop; +End; \ No newline at end of file