diff options
| author | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
|---|---|---|
| committer | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
| commit | 33613a85afc4b1481367fbe92a17ee59c240250b (patch) | |
| tree | 670b842326116b376b505ec2263878912fca97e2 /Bachelor/Datenbanken 2/Praktikum4 | |
| download | Studium-master.tar.gz Studium-master.tar.bz2 | |
Diffstat (limited to 'Bachelor/Datenbanken 2/Praktikum4')
16 files changed, 355 insertions, 0 deletions
diff --git a/Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.pdf b/Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.pdf Binary files differnew file mode 100644 index 0000000..0799a9e --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.pdf diff --git a/Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.zip b/Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.zip Binary files differnew file mode 100644 index 0000000..cf4b844 --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.zip diff --git a/Bachelor/Datenbanken 2/Praktikum4/DBII_plsql.pdf b/Bachelor/Datenbanken 2/Praktikum4/DBII_plsql.pdf Binary files differnew file mode 100644 index 0000000..334b6d9 --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum4/DBII_plsql.pdf diff --git a/Bachelor/Datenbanken 2/Praktikum4/assistenz_datenmodell.pdf b/Bachelor/Datenbanken 2/Praktikum4/assistenz_datenmodell.pdf Binary files differnew file mode 100644 index 0000000..5fdbb28 --- /dev/null +++ b/Bachelor/Datenbanken 2/Praktikum4/assistenz_datenmodell.pdf 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 [<Schema>.]<Sequenz>
+ [ INCREMENT BY <Wert> ]
+ [ START WITH <Wert> ]
+ [ NOMAXVALUE | MAXVALUE <Wert> ]
+ [ NOMINVALUE | MINVALUE <Wert> ]
+ [ NOCYCLE | CYCLE ]
+ [ NOCACHE | CACHE <Wert> ]
+ [ 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:
+-- <Sequenz>.NEXTVAL lässt sich den nächsten Wert erzeugen
+-- <Sequenz>.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');
+
+
+
|
