User Defined Functions (UDF)

Werbung
Objekt-Relationale (OR) Datenbanken
Übersicht
• Einführung: Objekt-relationale Erweiterungen von SQL (ORSQL)
• Objekte und Tabellen
• OR-Create, -Insert, -Update, -Select
• User-Defined Functions (UDFs) und Methoden
Literatur
O´Neil / O´Neil: Database – Principles, Programming, and
Performance, 2nd Edition. Morgan Kaufmann Publishers, 2001.
Karczewski
Datenbanken II
1
ORSQL Möglichkeiten
Relationale Tabellendefinitionen werden erweitert durch user defined
types:
Spalten, die mehr als einen Eintrag besitzen und solche, die eine interne
Struktur haben (wie ein Record), sind erlaubt (Verletzung 1NF).
Beispiel:
eid
ename
position
dep_age
Michael J.
Susan R.
9
7
e01
Smith, John
e02
Andrews, David Superintendent David M. Jr.
10
e03
Jones, Franklin Agent
11
9
4
Karczewski
Agent
dependents
dep_name
Datenbanken II
Andrew K.
Mark W.
Louisa M.
2
Objekte und Tabellen
Ein Objekt-Typ besitzt Attribute unterschiedlicher Typen, analog zu
Spalten einer Tabelle.
Beispiel (Oracle):
create type name_t as object
(
lname varchar(30), -fname varchar(30), -mi
char(1)
-);
/
--
Karczewski
-- „Create Object Type“
last name
first name
middle initial
SQL*Plus
Datenbanken II
3
Objekte und Tabellen
Nach der Definition eines Typs (mit „create type“) kann man diesen
so definierten Typ wie ein gewöhnliches Attribut benutzen.
Beispiel (Oracle):
create table
(
tid
tname
room
);
teachers
-- „Create Table Scheme“
int,
name_t,
int
-- identifier
-- object type defined above
-- room number
Bis hierher existieren noch keine Objekte vom Typ name_t.
Karczewski
Datenbanken II
4
Objekte und Tabellen
Einträge in die zuvor definierte Tabelle sind wie in SQL durch den
insert-Befehl möglich. Insert wird erweitert um die Möglichkeit,
Objekt-Typen zu integrieren. Dies geschieht durch Benutzung eines
Objekt-Konstruktors in dem insert-Befehl.
Beispiel (Oracle):
Objekt-Konstruktor
insert into teachers values
(
1234,
name_t(’Einstein’, ’Albert’, ’E’),
120
);
Karczewski
Datenbanken II
5
Objekte und Tabellen
Nach Ausführung des insert-Befehls liegt folgender Tabelleninhalt
vor:
Beispiel (Oracle):
tname
lname
1234 Einstein
room
tid
Karczewski
fname mi
Albert E
Datenbanken II
120
6
Objekte und Tabellen
Die Punkt-Notation wird konsequent genutzt, um Werte des ObjektTyps zu nutzen:
select t.tid
from
teachers t
where t.room = 120; -- normal SQL-select
select t.tid, t.tname.fname, t.tname.lname
from
teachers t
where t.room = 123; -- extended SQL
select tid, tname.fname, tname.lname
from
teachers
where room = 123; -- doesn´t work
Der alias t muss verwendet werden, damit die mehrfache PunktNotation funktioniert.
Karczewski
Datenbanken II
7
Objekte und Tabellen
Man kann die Objekt-Typ-Definition innerhalb einer anderen ObjektTyp-Definition verwenden.
Beispiel:
create type person_t as object
(
ssno
int,
pname name_t,
-- must be defined first
age
int
);
/
person_t ist abhängig von name_t, d.h. man kann name_t nicht
löschen bevor person_t gelöscht ist.
Karczewski
Datenbanken II
8
Objekte und Tabellen
Eine Tabelle wird Objekt-Tabelle genannt, wenn ihre Zeilen vom
Objekt-Typ sind. Das bedeutet: Jede Zeile enthält ein Objekt dieses
Typs.
Beispiel:
create table people of person_t
(
primary key(ssno)
);
Karczewski
Datenbanken II
9
Objekte und Tabellen
Beispiel-Tabelle people:
people
nameless top-level
column
(Zeilen-Objekte)
named columns (also
known as top-level
attributes)
select value(p)
select *
row objects
ssno
column objects
pname
age
pname.lname pname.fname pname.mi
attributes within pname
row 1
123550123
March
Jacquelin
E
23
row 2
245882134
Delaney
Patrick
X
59
row 3
023894455
Sanchez
Jose
F
30
Karczewski
Datenbanken II
10
Objekte und Tabellen (select-statements)
select p.age from people p where p.ssno = 123550123
(wie bei SQL)
select p.pname from people p where p.age > 25
Spalten werden mit vorangestelltem Typ ausgegeben,
z.B. name_t(´Sanchez´, ´Jose´, ´F´)
select * from people p where p.age > 25
Liefert die top-level Attribute (row objects)
ssno
--------245882134
023894455
Karczewski
pname(lname,fname,mi)
------------------------------name_t(´Delaney´,´Patrick´,´X´)
name_t(´Sanchez´,´Jose´,´F´)
Datenbanken II
age
---59
30
11
Objekte und Tabellen (select-statements)
select value(p) from people p where age > 25
Die Zeilen-Objekte werden ausgegeben (nameless top level column).
Value(p) ist nicht zu verwechseln mit VALUES im insert-Befehl.
Value(p)
-------person_t
person_t
(ssno,
-----(245882134,
(023894455,
pname(lname,fname,mi),
---------------------name_t(´Delaney´,´Patrick´,´X´),
name_t(´Sanchez´,´Jose´,´F´),
age)
---59)
30)
Person_t ist der Objekt-Konstruktur, mit dem die Tabelle definiert wurde.
Das Ergebnis ist ein anderes als das beim „select *“-Befehl.
Durch den Objekt-Konstruktor gibt es eine (neue) Objekt-Sicht auf die Zeilen
der Tabelle.
Karczewski
Datenbanken II
12
Objekte und Tabellen (select-statements)
select value(p) from people p
where p.pname = name_t(´Sanchez´,´Jose´,´F´)
Der Objekt-Konstruktor „name_t(´Sanchez´,´Jose´,´F´)“ kann auch innerhalb
der where-Klausel verwendet werden.
Value(p)
-------person_t
Karczewski
(ssno,
-----(023894455,
pname(lname,fname,mi),
---------------------name_t(´Sanchez´,´Jose´,´F´),
Datenbanken II
age)
---30)
13
Objekte und Tabellen (select-statements)
select p.pname, p.age from people p
where p.pname.fname like ‘Pat%‘ and p.age > 50;
“Nested dot”-Notation ist erlaubt. Der Vorname startet mit Pat und das Alter
ist größer als 50.
pname(lname,fname,mi)
--------------------name_t(´Delaney´,´Patrick´,´X´)
Karczewski
age
--59
Datenbanken II
14
Objekte und Tabellen (select-statements)
Wichtig: Man muss immer den vollqualifizierten Namen mit einem Alias
verwenden, um auf strukturierte Attribute zuzugreifen.
select pname.fname from people
pname.fname ist kein Top Level-Attribut -> Der Befehl funktioniert so
nicht.
select people.pname.fname from people
Auch hier muss ein Alias benutzt werden. Das Voranstellen des
Tabellennamen nutzt nichts. -> Der Befehl funktioniert so nicht.
select p.pname.fname from people p;
Korrekte Alternative!
Karczewski
Datenbanken II
15
Objekte und Tabellen (create und insert)
create table scientists of name_t
(primary key (lname));
Generierung der Tabelle mit Namen “scientists” des zuvor definierten ObjektTyps “name_t”.
insert into scientists select p.pname from people p;
Insert mit Einfügen mehrerer Zeilen durch Selektion aller “pnames” von
“people”. In diesem Fall werden alle Namen aus people eingefügt.
insert into scientists values (‘Einstein’, ‘Albert’, ‘E’);
Direktes Einfügen einer Zeile mit dem insert-Befehl.
Karczewski
Datenbanken II
16
Objects and Tables (insert)
update scientists s
set s = name_t(‘Eisenstein’, ‘Andrew’, ‘F’)
where values(s) = name_t(‘Einstein’, ‘Albert’, ‘E’);
Update einer Zeile mit Hilfe des Objekt-Konstruktors name_t.
insert into people
values (123441998, name_t(’Einstein’, ’Albert’, ’E’), 100);
Einfügen einer Zeile in “scientists” mit direkten Werten. Der ObjektKonstruktor name_t ist nötig bei dem strukturierten Attribut.
insert into people values (321341223, null, null);
insert into people (ssno) values (321341223);
Zwei äquivalente Befehle, um unvollständige Zeilen mit NULL-Werten
einzugeben. “pname” und “age” müssen optional sein.
Karczewski
Datenbanken II
17
Objects and Tables (update)
update people p
set p.pname = name_t(‘Gould’, ‘Ben’, null)
where ssno = 321341223;
Update einer Zeile mit NULL-Werten. Der “middle initial” bleibt NULL.
update people p
set p.pname.mi = ‘C’
where ssno = 321341223;
Update des “middle initial” der vorherigen Änderung.
update people p
set p = Person_t(332341223, name_t(‘Gould’, ‘Glen’, ‘A’), 55)
where ssno = 321341223;
Update einer Person mit dem “row object”-Konstruktor. Auch der primary
key ssno darf verändert werden.
Karczewski
Datenbanken II
18
Relational / Objekt-Relational
Produkt:
Karczewski
Nummer
Bezeichnung Funktion
110222
Tee-Service
Gebrauch
106222
Kanne
Gebrauch
201312
Schale
Deko
Datenbanken II
19
Relational / Objekt-Relational
Markt:
Karczewski
Bezeichnung
Standort
Kategorie
Internationaler
Töpfermarkt
Krefeld
Töpfermarkt
Töpfermarkt
Sommerhausen
Sommerhausen
Töpfermarkt
Internationaler
Töpfermarkt
Hanau
Töpfermarkt
Datenbanken II
20
Relational / Objekt-Relational
WAA:
Karczewski
Nummer
Bezeichnung
Standort
110222
Internationaler
Töpfermarkt
Krefeld
106222
Internationaler
Töpfermarkt
Krefeld
201312
Töpfermarkt
Sommerhausen
Sommerhausen
201312
Internationaler
Töpfermarkt
Hanau
Datenbanken II
21
Beispiel ORDB
Markt:
Bezeichnung
Internationaler
Töpfermarkt
Standort
Krefeld
Kategorie
Töpfermarkt
Marktteilnehmer
Nummer
Bezeichnung
Funktion
110222
Tee-Service
Gebrauch
106222
Kanne
Gebrauch
Töpfermarkt
Sommerhausen
Sommerhausen
Töpfermarkt
201312
Schale
Deko
Internationaler
Töpfermarkt
Hanau
Töpfermarkt
201312
Schale
Deko
Karczewski
Datenbanken II
22
Beispiel ORDB
Markt
Bezeichnung
Standort
Kategorie
Collection of Produkt_T
Karczewski
Datenbanken II
23
Beispiel ORDB
Karczewski
Datenbanken II
24
Beispiel ORDB
Karczewski
Datenbanken II
25
Beispiel ORDB
Karczewski
Datenbanken II
26
Beispiel ORDB
Karczewski
Datenbanken II
27
Beispiel ORDB
Karczewski
Datenbanken II
28
Beispiel ORDB
Karczewski
Datenbanken II
29
Beispiel ORDB
Karczewski
Datenbanken II
30
Beispiel ORDB
Karczewski
Datenbanken II
31
Beispiel ORDB
Karczewski
Datenbanken II
32
Beispiel ORDB
Karczewski
Datenbanken II
33
User Defined Functions
User Defined Functions (UDF) können zur Bindung von Funktionen an
Objekte genutzt werden (Methoden-Begriff).
Die Definition von UDFs erfolgt in zwei Schritten:
1. Definition des Funktionskopfes (function header)
2. Definition des Funktionsrumpfes (function body)
Der function header wird zusammen mit den Attributen des Objekttyps
definiert.
Der function body wird definiert mit einem speziellen Kommando mit einer
Referenz zum header.
Karczewski
Datenbanken II
34
User Defined Functions
Beispiel (Personen und ihre Mitarbeiter (dependents)):
create type name_t as object
-- „Create Object Type“
(
lname
varchar(30),
-- last name
mi
char(1),
-- middle initial
fname
varchar(30)-- first name
);
/
create type person_t as object
(
ssno int,
pname
name_t,
age int
);
/
-- must be defined first
create type depPerson_t as table of person_t;
/
Karczewski
Datenbanken II
35
User Defined Functions
Example (Function Header):
create type Employee_t as object
(
ENR
int,
Person
person_t,
depPerson
depPerson_t,
member function NumberOfDep
return integer,
member function BigBoss
return varchar
);
/
Die function header (auch mehrere möglich) werden hinter allen AttributDefinitionen definiert. Die Schlüsselwörter “member function” und
“return” mit entsprechendem Datentyp sind notwendig.
Karczewski
Datenbanken II
36
User Defined Functions
Beispiel (Funktionsrumpf):
Der Rumpf der Funktionen
erhält den selben
Namen wie der zuvor
definierte Objekt-Typ
(Verbindung zwischen
Kopf und Rumpf).
Der Name und return-Typ
muss hier wiederholt
werden.
Innerhalb “begin” und “end”
wird die Funktion
definiert.
Mindestens ein returnBefehl ist nötig.
create type body Employee_t as
member function NumberOfDep
return integer is
begin
return self.depPerson.count;
end NumberOfDep;
member function BigBoss
return varchar is
begin
if self.depPerson.count > 2
then return 'Big Boss';
else return 'Boss';
end if;
end BigBoss;
end;
/
Karczewski
Datenbanken II
37
User Defined Functions
Beispiel (Tabellen-Definition):
create table Employee of Employee_t
(
primary key (ENR)
) nested table depPerson store as dep_tab;
Diese Tabellendefinition realisiert die gewünschte Tabelle.
Der Primärschlüssel kann erst hier definiert werden.
Die “nested table”-Klausel erlaubt die Nutzung von Tabellen
innerhalb der Tabelle.
Möglich sind auch mehrere “nested tables” innerhalb einer Tabelle.
Karczewski
Datenbanken II
38
User Defined Functions
Beispiel (Insertion):
insert into Employee values
(1,
person_t(11, name_t('Josef', 'R', 'Ewing'), 59),
depPerson_T(person_t(33, name_t('Franz', 'X', 'Nonsense'), 33),
person_t(44, name_t('Uschi', 'K', 'Glas'), 48),
person_t(55, name_t('Mika', 'L', 'Most'), 52))
);
insert into Employee values
(2,
person_t(22, name_t('Karla', 'M', 'Hut'), 34),
depPerson_T(person_t(66, name_t('Hans', 'L', 'Moser'), 72),
person_t(77, name_t('Paul', 'A', 'Popp'), 41))
);
Karczewski
Datenbanken II
Das Einfügen
geschieht wie
bisher. Die UDFs
ändern das
bisherige Vorgehen
nicht!
39
User Defined Functions
Beispiel (Selection):
Beispiel (Selection):
select ENR, E.NumberOfDep()
from Employee E;
select ENR, E.BigBoss()
from Employee E;
ENR E.NUMBEROFDEP()
---------- --------------1
3
2
2
ENR E.BIGBOSS()
---------- -----------1
Big Boss
2
Boss
Der Resultat-Wert des Funktionsaufrufs wird als
eigene Spalte ausgegeben.
Die Klammern müssen angegeben werden.
Der alias ist Pflicht!
Karczewski
Datenbanken II
40
Beispiel ORDB (UDF)
Karczewski
Datenbanken II
41
Beispiel ORDB (UDF)
Karczewski
Datenbanken II
42
Beispiel ORDB (Ref)
Produkt
Nummer: int
Bezeichnung: String
Funktion: String
Subprodukt:
collection of Produkt
anzsub: int
… weitere Methoden
zur Stückliste
Karczewski
Datenbanken II
43
Beispiel ORDB (Ref)
Karczewski
Datenbanken II
44
Beispiel ORDB (Ref)
Karczewski
Datenbanken II
45
Beispiel ORDB (Ref)
Karczewski
Datenbanken II
46
Beispiel ORDB (Ref)
Karczewski
Datenbanken II
47
Beispiel ORDB (Ref)
Karczewski
Datenbanken II
48
Beispiel ORDB (Ref)
Karczewski
Datenbanken II
49
Herunterladen