From 33613a85afc4b1481367fbe92a17ee59c240250b Mon Sep 17 00:00:00 2001 From: Sven Eisenhauer Date: Fri, 10 Nov 2023 15:11:48 +0100 Subject: add new repo --- .../Datenbanken 2/Praktikum4/DBII_Praktikum4.pdf | Bin 0 -> 116329 bytes .../Datenbanken 2/Praktikum4/DBII_Praktikum4.zip | Bin 0 -> 284464 bytes Bachelor/Datenbanken 2/Praktikum4/DBII_plsql.pdf | Bin 0 -> 159958 bytes .../Praktikum4/assistenz_datenmodell.pdf | Bin 0 -> 22417 bytes .../Praktikum4/assistenz_function.sql | 50 +++++++++++++++++ .../Datenbanken 2/Praktikum4/assistenz_trigger.sql | 25 +++++++++ Bachelor/Datenbanken 2/Praktikum4/esql1.sql | 36 +++++++++++++ Bachelor/Datenbanken 2/Praktikum4/esql2.sql | 32 +++++++++++ Bachelor/Datenbanken 2/Praktikum4/esql3.sql | 32 +++++++++++ Bachelor/Datenbanken 2/Praktikum4/p1.sql | 30 +++++++++++ Bachelor/Datenbanken 2/Praktikum4/p1ins.sql | 8 +++ Bachelor/Datenbanken 2/Praktikum4/p1proc.sql | 19 +++++++ Bachelor/Datenbanken 2/Praktikum4/p1trigg.sql | 9 ++++ Bachelor/Datenbanken 2/Praktikum4/readme.txt | 17 ++++++ .../Datenbanken 2/Praktikum4/sequenz_Oracle.sql | 38 +++++++++++++ .../Datenbanken 2/Praktikum4/sequenz_Trigger.sql | 59 +++++++++++++++++++++ 16 files changed, 355 insertions(+) create mode 100644 Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.pdf create mode 100644 Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.zip create mode 100644 Bachelor/Datenbanken 2/Praktikum4/DBII_plsql.pdf create mode 100644 Bachelor/Datenbanken 2/Praktikum4/assistenz_datenmodell.pdf create mode 100644 Bachelor/Datenbanken 2/Praktikum4/assistenz_function.sql create mode 100644 Bachelor/Datenbanken 2/Praktikum4/assistenz_trigger.sql create mode 100644 Bachelor/Datenbanken 2/Praktikum4/esql1.sql create mode 100644 Bachelor/Datenbanken 2/Praktikum4/esql2.sql create mode 100644 Bachelor/Datenbanken 2/Praktikum4/esql3.sql create mode 100644 Bachelor/Datenbanken 2/Praktikum4/p1.sql create mode 100644 Bachelor/Datenbanken 2/Praktikum4/p1ins.sql create mode 100644 Bachelor/Datenbanken 2/Praktikum4/p1proc.sql create mode 100644 Bachelor/Datenbanken 2/Praktikum4/p1trigg.sql create mode 100644 Bachelor/Datenbanken 2/Praktikum4/readme.txt create mode 100644 Bachelor/Datenbanken 2/Praktikum4/sequenz_Oracle.sql create mode 100644 Bachelor/Datenbanken 2/Praktikum4/sequenz_Trigger.sql (limited to 'Bachelor/Datenbanken 2/Praktikum4') diff --git a/Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.pdf b/Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.pdf new file mode 100644 index 0000000..0799a9e Binary files /dev/null and b/Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.pdf differ diff --git a/Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.zip b/Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.zip new file mode 100644 index 0000000..cf4b844 Binary files /dev/null and b/Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.zip differ diff --git a/Bachelor/Datenbanken 2/Praktikum4/DBII_plsql.pdf b/Bachelor/Datenbanken 2/Praktikum4/DBII_plsql.pdf new file mode 100644 index 0000000..334b6d9 Binary files /dev/null and b/Bachelor/Datenbanken 2/Praktikum4/DBII_plsql.pdf differ diff --git a/Bachelor/Datenbanken 2/Praktikum4/assistenz_datenmodell.pdf b/Bachelor/Datenbanken 2/Praktikum4/assistenz_datenmodell.pdf new file mode 100644 index 0000000..5fdbb28 Binary files /dev/null and b/Bachelor/Datenbanken 2/Praktikum4/assistenz_datenmodell.pdf differ diff --git a/Bachelor/Datenbanken 2/Praktikum4/assistenz_function.sql b/Bachelor/Datenbanken 2/Praktikum4/assistenz_function.sql new file mode 100644 index 0000000..150d0d4 --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum4/assistenz_function.sql @@ -0,0 +1,50 @@ +-- Stored Function + +create or replace function pruef_operation(p_persnr integer, p_opnr integer) + return integer +as + v_persnr integer; + +begin + + select persnr into v_persnr + from operation + where opnr = p_opnr; + +if v_persnr = p_persnr +then return 0; +else return 1; +end if; + +end; +/ + + +-- Trigger + +create or replace trigger ASSISTENZ_INSERT +before insert on assistenz +for each row + +declare + Eingabe_nicht_zulaessig exception; + pragma exception_init (Eingabe_nicht_zulaessig, -20001); + + antwort integer; + +begin + + antwort := pruef_operation(:new.persnr,:new.opnummer); + + if antwort = 0 + then raise Eingabe_nicht_zulaessig; + end if; + + exception + when Eingabe_nicht_zulaessig then + raise_application_error + (-20001, 'Chirurg ' || :new.persnr || ' leitet diese Operation!'); + +end; +/ + diff --git a/Bachelor/Datenbanken 2/Praktikum4/assistenz_trigger.sql b/Bachelor/Datenbanken 2/Praktikum4/assistenz_trigger.sql new file mode 100644 index 0000000..d252b1c --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum4/assistenz_trigger.sql @@ -0,0 +1,25 @@ +create or replace trigger ASSISTENZ_INSERT +before insert on assistenz +for each row + +declare + Eingabe_nicht_zulaessig exception; + pragma exception_init (Eingabe_nicht_zulaessig, -20001); + + antwort integer; + +begin + + antwort := pruef_operation(:new.persnr,:new.opnummer); + + if antwort = 0 + then raise Eingabe_nicht_zulaessig; + end if; + + exception + when Eingabe_nicht_zulaessig then + raise_application_error + (-20001, 'Chirurg ' || :new.persnr || ' leitet diese Operation!'); + +end; +/ diff --git a/Bachelor/Datenbanken 2/Praktikum4/esql1.sql b/Bachelor/Datenbanken 2/Praktikum4/esql1.sql new file mode 100644 index 0000000..b1d631a --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum4/esql1.sql @@ -0,0 +1,36 @@ +-- Anonymer PL/SQL-Block + +-- Deklarationsblock +declare + cursor c is select gehalt from angestellter + for update of gehalt; + + v_gehalt angestellter.gehalt%type; + +-- Ausführungsblock +begin + -- Cursor öffnen + open c; + + -- erste Zeile lesen + fetch c into v_gehalt; + + -- alle Zeilen der Ergebnistabelle lesen + while c%found loop + + if v_gehalt > 10000 + then update angestellter + set gehalt = gehalt * 1.03 + where current of c; + else update angestellter + set gehalt = gehalt * 1.02 + where current of c; + end if; + + fetch c into v_gehalt; + + end loop; + +end; +/ + diff --git a/Bachelor/Datenbanken 2/Praktikum4/esql2.sql b/Bachelor/Datenbanken 2/Praktikum4/esql2.sql new file mode 100644 index 0000000..f821d5e --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum4/esql2.sql @@ -0,0 +1,32 @@ +-- als stored procedure ohne explizites declare + +create or replace procedure neugehalt +as + cursor c is select gehalt + from angestellter + for update of gehalt; + + v_gehalt angestellter.gehalt%type; + +-- Ausführungsblock +begin + -- Cursor öffnen + open c; + + -- erste Zeile lesen + fetch c into v_gehalt; + + -- alle Zeilen der Ergebnistabelle lesen + while c%found loop + if v_gehalt > 10000 + then update angestellter set gehalt = gehalt * 1.03 + where current of c; + else update angestellter set gehalt = gehalt * 1.02 + where current of c; + end if; + fetch c into v_gehalt; + end loop; + +end; +/ + diff --git a/Bachelor/Datenbanken 2/Praktikum4/esql3.sql b/Bachelor/Datenbanken 2/Praktikum4/esql3.sql new file mode 100644 index 0000000..bd2d1aa --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum4/esql3.sql @@ -0,0 +1,32 @@ +-- als stored procedure mit Parameteruebergabe + +create or replace procedure neugehalt(proz1 number, proz2 number) +as + cursor c is select gehalt + from angestellter + for update of gehalt; + + v_gehalt angestellter.gehalt%type; + +-- Ausführungsblock +begin + -- Cursor öffnen + open c; + + -- erste Zeile lesen + fetch c into v_gehalt; + + -- alle Zeilen der Ergebnistabelle lesen + while c%found loop + if v_gehalt > 10000 + then update angestellter set gehalt = gehalt * proz1 + where current of c; + else update angestellter set gehalt = gehalt * proz2 + where current of c; + end if; + fetch c into v_gehalt; + end loop; + +end; +/ + diff --git a/Bachelor/Datenbanken 2/Praktikum4/p1.sql b/Bachelor/Datenbanken 2/Praktikum4/p1.sql new file mode 100644 index 0000000..2d6b2a1 --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum4/p1.sql @@ -0,0 +1,30 @@ +drop table position; +drop table produkt; +drop table rechnung; + +create table produkt +( pnr integer, + pbez varchar2(20), + preis number(8,2), + constraint is_PKprod primary key(pnr) +); + +create table rechnung +( rnr integer, + datum date, + pges number(8,2), + primary key(rnr) +); + +create table position +( rnr integer, + pnr integer, + menge integer, + primary key(rnr,pnr), + foreign key(rnr) references rechnung(rnr), + foreign key(pnr) references produkt(pnr) +); + + + + diff --git a/Bachelor/Datenbanken 2/Praktikum4/p1ins.sql b/Bachelor/Datenbanken 2/Praktikum4/p1ins.sql new file mode 100644 index 0000000..fca2ec7 --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum4/p1ins.sql @@ -0,0 +1,8 @@ +insert into produkt +values(1,'Tisch',400.00); +insert into produkt +values(2,'Stuhl',80.00); +insert into produkt +values(3,'Schrank',2580.00); +insert into produkt +values(4,'Bett',1750.00); diff --git a/Bachelor/Datenbanken 2/Praktikum4/p1proc.sql b/Bachelor/Datenbanken 2/Praktikum4/p1proc.sql new file mode 100644 index 0000000..e1febad --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum4/p1proc.sql @@ -0,0 +1,19 @@ +create or replace procedure +setpreis(r integer, p integer, m integer) +as + +vpreis produkt.preis%type; + +begin + +select preis into vpreis +from produkt +where pnr = p; + +update rechnung +set pges = pges + vpreis * m +where rnr = r; + +end; +/ + diff --git a/Bachelor/Datenbanken 2/Praktikum4/p1trigg.sql b/Bachelor/Datenbanken 2/Praktikum4/p1trigg.sql new file mode 100644 index 0000000..2af809e --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum4/p1trigg.sql @@ -0,0 +1,9 @@ +create or replace trigger POSITION_AR_INSERT +after insert on position +for each row +begin + +setpreis(:new.rnr,:new.pnr,:new.menge); + +end; +/ diff --git a/Bachelor/Datenbanken 2/Praktikum4/readme.txt b/Bachelor/Datenbanken 2/Praktikum4/readme.txt new file mode 100644 index 0000000..9b433c0 --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum4/readme.txt @@ -0,0 +1,17 @@ +Das ZIP-File DBII_Praktikum4 enthält die folgenden Dateien: + +- DBII_Praktikum4.pdf: Praktikumsaufgabe 4 +- DBII_plsql.pdf: Anlagemit Hinweisen zur PL/SQL-Syntax unter Oracle. + +- assistenz_*.*: Datenmodell, Stored Function und Trigger zur Hörsaalübung + vom 24.04.2006 + +- esql*.sql: PL/SQL-Skripts zu den Beispielen aus den Folien zur Vorle- + sung, Kapitel 6.2.1 + +- p1*.sql: DDL-Skript, Inserts, Stored Procedure und Trigger zum + Beispiel aus dem Skript, Kapitel 6.2.2 + +- sequenz_*.sql: Trigger zur Generierung eines Autoinkrement-Datentyps und + Oracle Sequence-Objekte + diff --git a/Bachelor/Datenbanken 2/Praktikum4/sequenz_Oracle.sql b/Bachelor/Datenbanken 2/Praktikum4/sequenz_Oracle.sql new file mode 100644 index 0000000..6902f5b --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum4/sequenz_Oracle.sql @@ -0,0 +1,38 @@ +-- Der Oracle-Sequenzdefinition +-- Zur Generierung von systemseitig vergebenen, synthetischen und fort- +-- laufenden Schlüsselwerten bietet Oracle das Sequenz-Konzept an: + +CREATE SEQUENCE [.] + [ INCREMENT BY ] + [ START WITH ] + [ NOMAXVALUE | MAXVALUE ] + [ NOMINVALUE | MINVALUE ] + [ NOCYCLE | CYCLE ] + [ NOCACHE | CACHE ] + [ ORDER | NOORDER ]; + +-- die unterschiedlichen Klauseln sind z.T. selbsterklärend bzw. +-- vgl. die Oracle-Literatur! + +-- *************************************************************** + +-- Beispielsequenz für die Testtabelle mit defaults für alle Klauseln +-- ausser INCREMENT BY 2 bei Startwert 2 + +CREATE SEQUENCE testsequenz INCREMENT BY 2 START WITH 2; + +-- *************************************************************** + +-- Eine definierte Sequenz kann anschliessende in Insert- und Update- +-- Anweisungen benutzt werden: +-- .NEXTVAL lässt sich den nächsten Wert erzeugen +-- .CURVAL lässt den (auch wiederholten) Zugriff auf den +-- aktuellen Seuqenzwert zu + +-- **************************************************************** +-- Inserts auf unserer Test-Tabelle über die Sequenz "testsequenz" +-- vorsichtshalber vorher: + +delete from test; + +insert into test values (testsequenz.nextval, 'DDD'); \ No newline at end of file diff --git a/Bachelor/Datenbanken 2/Praktikum4/sequenz_Trigger.sql b/Bachelor/Datenbanken 2/Praktikum4/sequenz_Trigger.sql new file mode 100644 index 0000000..38963db --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum4/sequenz_Trigger.sql @@ -0,0 +1,59 @@ +-- Trigger zur Generierung eines synthetischen, sequenziellen Integer- +-- Datentyps + +--************************************************************ + +-- Der Trigger wird für die folgende Tabelle Test generiert: + +create table test +( mypk integer not null, + mycolumn varchar2(3), + primary key (mypk) +); + +--************************************************************ +-- TRIGGER-DEKLARATION +--************************************************************ + +-- trigger-kopf +create or replace trigger synthkey +before insert on test +for each row + +-- deklarationsblock +declare + vmax integer; + +-- Anweisungen +begin + +-- max wert von pk suchen +select max(mypk) into vmax +from test; + +if vmax is null +then vmax := 0; +end if; + +vmax:=vmax+1; + +-- aktuellen PK-Wert des Inserts mit vmax belegen +:new.mypk := vmax; + +end; +/ + +-- *************************************************** + + +-- entweder gibt man beim insert für die PK-Spalte mypk einen dummy ein, +-- der dann vom Trigger überschrieben wird: + +insert into test values (0,'AAA'); + +-- oder man lässt den Wert für die PK-Spalte beim insert weg: + +insert into test (mycolumn) values ('BBB'); + + + -- cgit v1.2.3