summaryrefslogtreecommitdiffstats
path: root/Bachelor/Datenbanken 2/Praktikum4
diff options
context:
space:
mode:
Diffstat (limited to 'Bachelor/Datenbanken 2/Praktikum4')
-rw-r--r--Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.pdfbin0 -> 116329 bytes
-rw-r--r--Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.zipbin0 -> 284464 bytes
-rw-r--r--Bachelor/Datenbanken 2/Praktikum4/DBII_plsql.pdfbin0 -> 159958 bytes
-rw-r--r--Bachelor/Datenbanken 2/Praktikum4/assistenz_datenmodell.pdfbin0 -> 22417 bytes
-rw-r--r--Bachelor/Datenbanken 2/Praktikum4/assistenz_function.sql50
-rw-r--r--Bachelor/Datenbanken 2/Praktikum4/assistenz_trigger.sql25
-rw-r--r--Bachelor/Datenbanken 2/Praktikum4/esql1.sql36
-rw-r--r--Bachelor/Datenbanken 2/Praktikum4/esql2.sql32
-rw-r--r--Bachelor/Datenbanken 2/Praktikum4/esql3.sql32
-rw-r--r--Bachelor/Datenbanken 2/Praktikum4/p1.sql30
-rw-r--r--Bachelor/Datenbanken 2/Praktikum4/p1ins.sql8
-rw-r--r--Bachelor/Datenbanken 2/Praktikum4/p1proc.sql19
-rw-r--r--Bachelor/Datenbanken 2/Praktikum4/p1trigg.sql9
-rw-r--r--Bachelor/Datenbanken 2/Praktikum4/readme.txt17
-rw-r--r--Bachelor/Datenbanken 2/Praktikum4/sequenz_Oracle.sql38
-rw-r--r--Bachelor/Datenbanken 2/Praktikum4/sequenz_Trigger.sql59
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
new file mode 100644
index 0000000..0799a9e
--- /dev/null
+++ b/Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.pdf
Binary files 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
--- /dev/null
+++ b/Bachelor/Datenbanken 2/Praktikum4/DBII_Praktikum4.zip
Binary files 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
--- /dev/null
+++ b/Bachelor/Datenbanken 2/Praktikum4/DBII_plsql.pdf
Binary files 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
--- /dev/null
+++ b/Bachelor/Datenbanken 2/Praktikum4/assistenz_datenmodell.pdf
Binary files 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 [<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');
+
+
+