Basi di Dati Relazionali ad Oggetti
0
RDBMS: panorama attuale



1
Gestiscono e manipolano dati semplici
(tabellari)
Hanno un linguaggio di interrogazione (SQL)
semplice, dichiarativo e standard
Tool consolidati per lo sviluppo di applicazioni
(Oracle Developer, Sybase Power Builder,
Microsoft Visual Basic)
RDBMS: panorama attuale






2
Portabili su diverse piattaforme
Esempi di RDBMS: IBM DB2, Oracle, Sybase,
Informix, Microsoft SQL Server
Buone prestazioni
Affidabilità, gestione transazioni
Basati su una architettura client-server supportano
efficientemente un gran numero di utenti
Forniscono meccanismi di controllo dell’accesso
RDBMS: panorama attuale

3
Oggi il mercato mondiale dei RDBMS supera i
50 billioni di dollari all’anno, ma… i RDBMS
presentano anche alcuni limiti
RDBMS: problemi

Prevalentemente connessi alle caratteristiche
intrinseche del modello relazionale:
–
–
–
4
SQL-92 fornisce solo un insieme limitato di tipi di
dato
le tabelle hanno una struttura flat e non forniscono
un buon supporto per strutture annidate, quali
insiemi ed array
non è possibile definire relazioni di sotto-tipo tra gli
oggetti di un database
RDBMS: problemi


5
Le associazioni tra entità vengono modellate
per valore e questo nel caso di associazioni
complesse può richiedere la creazione di
parecchie tabelle/colonne “fittizie”
Gli RDBMS non sfruttano gli approcci objectoriented per la progettazione e realizzazione di
software che oggi stanno diventando
pressochè uno standard
OODBMS: panorama attuale




6
Permettono di modellare direttamente oggetti
complessi e le loro associazioni
Object-orientation sempre più diffuso in ambito
software engineering e programmazione:
unicità del paradigma
Buone prestazioni per applicazioni
navigazionali
Limitato supporto per concorrenza,
parallelismo e distribuzione
OODBMS: panorama attuale



7
Semplici modelli transazionali
Limitate funzionalità di controllo dell’accesso
Coprono un mercato di nicchia che richiede
accessi navigazionali efficienti (disegno di chip,
ecc.)
OODBMS: problemi



8
Il progetto del database è strettamente legato
al progetto delle applicazioni
Mancanza di un modello dei dati e di un
linguaggio di query standard pienamente
accettati
Mancanza di un linguaggio di query
dichiarativo (SQL-like)
RDBMS vs. OODBMS


9
RDBMS forniscono un supporto efficiente ed
efficace per applicazioni che manipolano dati
semplici
OODBMS forniscono un supporto efficiente per
alcune classi di applicazioni su dati complessi,
ma senza molti degli aspetti positivi dei
RDBMS
Il modello relazionale ad oggetti

10
I DBMS relazionali ad oggetti (object-relational)
nascono dall’esigenza di assicurare le
funzionalità dei RDBMS rispetto alla gestione
di dati tradizionali, estendendo il modello dei
dati con la possibilità di gestire dati complessi
tipica degli OODBMS
ORDBMS: caratteristiche generali

Nuovi tipi di dato:
–
–
–


11
testi, immagini, audio/video, dati geografici, ecc.
tipi di dato user-defined
tipi collezione
Metodi per modellare le operazioni sui tipi
definiti dall'utente (es. Java, C)
Nuovi modi per modellare le associazioni
ORDBMS: caratteristiche generali

La filosofia per la gestione dei dati è però
ancora quella relazionale:
–
–
12
Tutti gli accessi ai dati avvengono tramite SQL
Tutti le entità di interesse sono modellate tramite
tabelle
ORDBMS: panorama attuale



13
Oggi quasi tutti i principali produttori di RDBMS
(Oracle, Informix, DB2,..) hanno esteso i loro
DBMS con caratteristiche object-relational
Tali estensioni presuppongono anche una
estensione del linguaggio SQL
Allo stato attuale ogni RDBMS ha
un’estensione proprietaria object-relational
ORDBMS: panorama attuale

Le estensioni differiscono per:
–
–
–

14
Le funzionalità che supportano
Il modo di realizzarle
Le estensioni apportate ad SQL
E questo nonostante SQL-99 ...
Lo standard SQL-99



15
SQL-99 è un tentativo di standardizzazione
dell’estensione object-relational del modello
relazionale
Al momento della definizione di SQL-99 i
maggiori produttori di RDBMS avevano già la
loro versione delle estensioni object-relational
SQL-99 non standardizza tutte le funzionalità
object-relational presenti nei DBMS
commerciali
Lo standard SQL-99


16
E’ quindi ancora presto per capire quando e in
che misura lo standard sarà recepito a livello
commerciale
La sensazione è che sarà necessario un
ulteriore standard che medi tra tutte le
estensioni proprietarie
Nel seguito …


Discutere le caratteristiche generali di un
ORDBMS
discuteremo come queste caratteristiche
vengono gestite dallo standard
–

17
se non altrimenti specificato, utilizzeremo la sintassi
di SQL-99
introdurremo le caratteristiche relazionali ad
oggetti di Oracle
Estensione del sistema di tipi
18
Sistema dei tipi in SQL92

In SQL-92 i tipi di un attributo in una relazione
possono essere:
–
–
–
–
–
19
numerici (interi, reali, ecc.)
carattere (stringhe di lunghezza fissa o variabile,
caratteri singoli)
temporali (date, time, datetime, interval)
booleani (true, false)
non strutturati (BYTE, TEXT, BLOB, CLOB)
Sistema dei tipi in SQL92


20
Per ogni tipo built-in esistono un insieme fisso
e predefinito di operazioni che su di esso
possono essere eseguite
Queste limitazioni rendono spesso difficile la
rappresentazione di dati reali
Estensione del sistema di tipi


Tipi semplici
Abstract data types
–


Tipi riferimento
Tipi complessi:
–
21
User-defined types
tipi record e tipi collezione
Tipi semplici


22
I tipi semplici (o distinct type) sono la forma più
semplice di estensione del sistema dei tipi
fornita da un ORDBMS
Consentono agli utenti di creare nuovi tipi di
dati, basati su un solo tipo (built-in o userdefined)
Tipi semplici



23
Sono usati per definire tipi di dati che
richiedono operazioni diverse rispetto al tipo su
cui sono definiti
I tipi semplici sono considerati dal DBMS
totalmente distinti dal tipo su cui si basano
I valori del tipo semplice non sono direttamente
confrontabili con quelli del tipo su cui si basano
(strong typing)
Tipi semplici



24
Confronti con il tipo base o con altri tipi
semplici definiti sullo stesso tipo base
richiedono operazioni di cast
l’ORDBMS crea automaticamente una
funzione di cast quando un nuovo tipo
semplice viene creato
Non è fornito alcun meccanismo di ereditarietà
e subtyping per i tipi semplici
Esempio



25
Si supponga di creare un nuovo tipo id_impiegato
basato sul tipo intero
Come il tipo intero, id_impiegato è utilizzato per
memorizzare valori numerici ma il DBMS tratterà i due
tipi come tipi distinti
Per i due tipi possono essere definite operazioni
diverse (ad esempio la somma di due identificatori non
ha senso, mentre potrebbe essere utile una
operazione di confronto)
Tipi semplici in SQL-99

SQL-99 consente di definire tipi semplici basati
solo su tipi built-in
CREATE TYPE <name> AS <built-in type>
FINAL

26
Vedremo in seguito il significato della clausola
FINAL
Esempio
CREATE TYPE id_impiegato AS INTEGER FINAL;
CREATE TABLE Impiegati(
id
id_impiegato,
nome
VARCHAR(50),
età
INTEGER,
id_manager id_impiegato);
27
Casting

I valori dei distinct type sono considerati come
distinti dai valori del tipo di base
–

28
il casting non è automatico
le funzioni di cast (se necessarie) vanno
implementate esplicitamente, eventualmente
direttamente dal sistema
Esempio - assegnazione
SELECT nome
FROM Impiegati
WHERE id_manager = 123;
29
errore
Esempio - confronto
CREATE TYPE Euro AS Decimal(8,2) FINAL;
CREATE TYPE Dollaro_USA AS Decimal(8,2) FINAL;
CREATE TABLE Vendite_Europee(
n_cliente
INTEGER,
n_ordine
INTEGER,
totale
Euro);
CREATE TABLE Vendite_USA(
n_cliente
INTEGER,
n_ordine
INTEGER,
totale
Dollaro_USA);
30
Esempio: confronto
SELECT n_cliente,n_ordine
FROM Vendite_Europee ERP, Vendite_USA USA
WHERE ERP.n_ordine = USA.n_ordine
AND ERP.totale > USA.totale;
errore!!!
31
Casting in SQL-99

Il DBMS definisce due funzioni di casting
per ogni nuovo tipo semplice:
–
–
32
una per passare dal distinct type al tipo builtin
una per passare dal tipo built-in al distinct
type
Funzioni di casting in SQL-99
CREATE CAST (<source type> AS <target type>)
WITH <segnatura funzione>
[AS ASSIGNMENT]




33
<source type>: tipo input
<target type>: tipo output
almeno uno tra <source type> e <target type> deve
essere un tipo definito dall’utente
l’altro può essere un tipo qualunque
Funzioni di casting in SQL-99


<segnatura funzione> è la segnatura di una
qualunque funzione
la funzione deve essere definita come segue:
FUNCTION <name> (<source type>) RETURNS
<target type>
… codice ...
34
Funzioni di casting in SQL-99


35
Se la clausola AS ASSIGNMENT è specificata,
il casting è invocato implicitamente quando
necessario
per ogni coppia di tipi può esistere una sola
funzione di casting definita dall’utente
Funzioni di casting in SQL-99

36
Le funzioni di casting per i tipi semplici
vengano create automaticamento dal sistema
con la clausola AS ASSIGNMENT
Casting in SQL-99

La funzione di casting può essere invocata:
–
–

37
esplicitamente
CAST(<source type> as <target type>)
implicitamente, senza invocare la funzione CAST
la stessa funzione può essere invocata per
casting su tipi built-in (esempio: integer in real)
Esempio
SELECT nome
FROM Impiegati
WHERE id_manager = CAST(123 AS id_impiegato);
SELECT nome
FROM Impiegati
WHERE id_manager = 123;
38
Esempio
SELECT n_cliente,n_ordine
FROM Vendite_Europee ERP, Vendite_USA USA
WHERE ERP.n_ordine = USA.n_ordine
AND CAST(ERP.totale AS Decimal(8,2) >
CAST(USA.totale AS Decimal(8,2));
39
Esempio - alternativa

Per passare da Euro a Dollaro_USA posso anche definire una
nuova funzione di cast
CREATE FUNCTION f(e Euro) RETURNS Dollaro_USA
BEGIN
DECLARE g DECIMAL(8,2);
SET g = e;
RETURN g;
END;
40
CREATE CAST(Euro AS Dollaro_USA)
WITH FUNCTION f(Euro);
ADT

Un abstract data type include:
–
–
41
uno o più attributi
uno o più metodi
ADT in SQL-99

Gli attributi possono essere dichiarati come gli
attributi di una tabella
–
–

il tipo può essere instanziabile oppure no
–
42
possono usare clausole default
non è possibile specificare vincolo NOT NULL
vedremo meglio dopo
ADT in SQL-99
Se ci sono solo attributi (completeremo in
seguito la definizione):
CREATE TYPE <nome tipo>
AS <lista definizione attributi>
[{INSTANTIABLE|NOT INSTANTIABLE}]
{FINAL|NOT FINAL}


43
INSTANTIABLE è il default
Esempio


Si supponga di voler rappresentare l’indirizzo
di un impiegato in un RDBMS
Sono possibili due opzioni:
–
–
44
indirizzo: VARCHAR(n)
rappresentare ogni componente dell’indirizzo come
un attributo separato
Esempio
CREATE TYPE t_indirizzo AS
numero_civico INTEGER,
via
VARCHAR(50),
città
CHAR(20),
stato
CHAR(2),
cap
INTEGER
NOT FINAL;
45
t_indirizzo è un tipo complesso i cui attributi hanno tipi
predefiniti
ADT

Gli ADT possono anche essere annidati:
CREATE TYPE t_impiegato AS
id
id_impiegato,
nome
CHAR(20),
curriculum TEXT,
indirizzo
t_indirizzo
NOT FINAL;
46
ADT

47
Gli ADT possono essere usati come:
–
tipi di una colonna in una relazione
–
tipi di una tabella (row type)
ADT come tipo di colonna

Gli ADT possono essere usati come tipi di una
colonna di una relazione
CREATE TABLE Impiegati (
imp#
id_impiegato,
nome
CHAR(20),
curriculum TEXT,
indirizzo t_indirizzo);
48
ADT come tipo di colonna
Tabella Impiegati
imp#
49
nome
curriculum
indirizzo
numero_civico via città stato cap
Metodi

Sugli ADT possono essere definiti (segnature
di) metodi come parte della definizione del tipo:
CREATE TYPE t_libro AS
titolo
CHAR(20),
prezzo_vendita DECIMAL(9,2),
prezzo_acquisto DECIMAL(9,2)
NOT FINAL
METHOD guadagno() RETURNS
DECIMAL(9,2);
50
Metodi




I metodi sono funzioni definite dall’utente associate ai
tipi
Possono essere scritti in linguaggi proprietari del
DBMS o in linguaggi di programmazione standard (es.
Java)
La sintassi varia notevolmente a seconda del DBMS
utilizzato
definizione simile a quella delle funzioni
–
51
differenza: i metodi hanno un parametro implicito che
rappresenta l’oggetto su cui il metodo viene invocato
Metodi in SQL-99

Vengono creati con il comando CREATE METHOD
CREATE METHOD <nome metodo>
(lista parametri)
RETURNS <output data type>
FOR <nome UDT>
<corpo metodo>
52
Esempio
CREATE METHOD guadagno()
RETURNS DECIMAL(9,2)
FOR t_libro
RETURN (SELF.prezzo_vendita - SELF.prezzo_acquisto);
CREATE FUNCTION guadagno(l t_libro)
RETURNS DECIMAL(9,2)
RETURN (l.prezzo_vendita - l.prezzo_acquisto);
53
Incapsulazione


54
Gli ADT possono essere incapsulati
in questo caso, la loro manipolazione può
avvenire solo mediante apposite funzioni
automaticamente create dal DBMS al
momento della creazione dell’ADT
Incapsulazione in SQL-99

Incapsulazione stretta
Tre tipi di metodi predefiniti

costruttore: per creare una nuova istanza di ADT
– metodi observer: per formulare interrogazioni su
ADT
– metodi mutator: per cambiare valori ad istanze di
ADT
TIPO = CLASSE

–
55
Metodo costruttore



56
Ad ogni ADT è automaticamente associato un
metodo (costruttore) con lo stesso nome del
tipo
Il costruttore crea un'istanza del tipo
al costruttore possono in genere essere
passati i valori da assegnare alle componenti
dell’istanza creata
Costruttori in SQL-99

Per ogni ADT T, esiste un costruttore T( )
t_indirizzo()
----> t_indirizzo
crea una nuova istanza del tipo t_indirizzo con gli attributi inizializzati
ai valori di default (tali valori possono anche essere NULL)
t_indirizzo(39, ‘Comelico', 'Milano', 'IT', 20135)
57
crea una nuova istanza del tipo t_indirizzo con gli attributi
inizializzati in base ai valori forniti
Esempio - inserimento 1
INSERT INTO Impiegati
VALUES(SM123,‘Smith’,NULL,t_indirizzo(14,‘Sauli',
‘Milano’,'IT', 20135));
58
imp#
nome
SM123
Smith
curriculum
NULL
indirizzo
numero_civico via città stato cap
14
Sauli Milano IT 20135
Metodi mutator

Servono per modificare istanze di un ADT
numero_civico(INTEGER) --> t_indirizzo
via(VARCHAR(50)) --> t_indirizzo
città(CHAR(20)) --> t_indirizzo
stato(CHAR(2)) --> t_indirizzo
cap(INTEGER) --> t_indirizzo

59
vale anche per SQL-99
Esempio


Vogliamo inserire la tupla nella tabella
impiegati:
imp#
nome
SM123
Smith
NULL
indirizzo
numero_civico via città stato cap
14
Sauli Milano IT 20135
In due passi:
–
60
curriculum
–
creo la tupla inizializzando il campo indirizzo
aggiorno i valori del campo indirizzo
Esempio - inserimento 2
INSERT INTO Impiegati
VALUES(SM123,‘Smith’,NULL,t_indirizzo());
UPDATE Impiegati
SET indirizzo = indirizzo.numero_civico(14)
WHERE imp# = ‘SM123’;
UPDATE Impiegati
indirizzo = indirizzo.via(‘Sauli’)
WHERE imp# = ‘SM123’;
….
61
Esempio - inserimento 3
BEGIN
DECLARE i t_indirizzo;
SET i = t_indirizzo();
SET i = i.numero_civico(14);
SET i = i.via(‘Sauli’);
SET i = i.città(‘Milano’);
SET i = i.stato(‘IT’);
SET i = i.cap(20135);
INSERT INTO impiegati VALUES (‘SM123’,’Smith’,NULL,i);
END;
62
Metodi observer

Per ogni componente di un ADT è automaticamente
creato dal sistema un metodo observer con lo stesso
nome della componente:
numero_civico( ) ----> INTEGER
via( ) ----> VARCHAR(50)
città( ) ----> CHAR(20)
stato( ) ----> CHAR(2)
cap( ) ----> INTEGER

63
Anche in SQL-99
Esempi di selezione
SELECT nome
FROM Impiegati
WHERE indirizzo.città( ) = ‘Milano’
OR indirizzo.città( ) = ‘Roma’;
SELECT indirizzo.città()
FROM impiegati
WHERE nome = ‘Smith’;
64
Istanze di un ADT

Dato un ADT T con attributi attr1,…,attrn,
un’istanza per T viene indicata con
T(v_attr1,…,v_attrn), dove v_attr1,…,v_attrn
valori per gli attributi attr1,…,attrn
t_indirizzo(14,’Sauli’,’Milano’,’IT’,20135)
65
Selezione

La selezione di una colonna ADT restituisce un’istanza
di quel tipo
SELECT indirizzo
FROM Impiegati
WHERE imp# = ‘SM123’
si ottiene
66
t_indirizzo(14,’Sauli’,’Milano’,’IT’,20135)
Cancellazione
DELETE FROM Impiegati
WHERE indirizzo =
t_indirizzo(14,’Sauli’,’Milano’,’IT’,20135);
67
Update
UPDATE Impiegati
SET indirizzo = indirizzo.n_civico(18)
WHERE imp# = ‘SM123’ ;
UPDATE Impiegati
WHERE indirizzo =
t_indirizzo(18,’XX Settembre’,’Genova’,’IT’,16100);
68
Uso di metodi nelle query
CREATE TYPE t_libro AS
titolo
CHAR(20),
prezzo_vendita DECIMAL(9,2),
prezzo_acquisto DECIMAL(9,2)
NOT FINAL
METHOD guadagno() RETURNS DECIMAL(9,2);
CREATE TABLE biblioteca
(codL# INTEGER,
libro t_libro);
69
SELECT b.libro.guadagno( )
FROM biblioteca b
WHERE b.libro.titolo() = ‘La Divina Commedia’;
Vincoli di integrità


Non è possibile definire vincoli di PRIMARY
KEY, UNIQUE, FOREIGN KEY su un campo
ADT
Motivazione
–
–
70
concettualmente tutto è OK
problemi legati all’efficienza
Operazioni


Casting definito dall’utente tra ADT e altro tipo
possibilità di definire funzioni di ordinamento e
di confronto
–
71
non le vediamo
Cancellazione e modifica tipi
DROP TYPE <nome_tipo> {CASCADE|RESTRICT};
ALTER TYPE <nome_tipo> <operazione_di_modifica>;
<operazione_di_modifica>::=
ADD ATTRIBUTE <definizione_attributo>|
DROP ATTRIBUTE <nome_attributo>
72
Row type


73
Un ADT può anche essere usato come tipo di
una intera tabella (row type)
Le righe della tabella sono istanze del tipo
mentre le colonne coincidono con gli attributi
del tipo
Row type

Permettono di:
–
–
–



74
definire un insieme di tabelle che condividono la stessa
struttura (typed tables)
modellare in modo intuitivo le associazioni tra dati in tabelle
diverse (referenceable tables)
definire gerarchie di tabelle
TUPLA DI UNA TYPED TABLE = OGGETTO
ogni tupla è associata ad un identificatore, che
rappresenta un campo aggiuntivo per ogni tabella ed è
unico nel sistema
per default, gli identificatori sono generati dal sistema
–
esistono altre modalità, non le vediamo
Typed tables in SQL-99
CREATE TABLE <nome_tabella>
OF <nome_tipo_complesso>
[(REF IS <nome_campo_TID>)]



75
la clausola REF IS indica il nome di un attributo (distinto dai
precedenti) nel quale verranno inseriti gli identificatori di tupla (TID
- tuple identifier)
il campo identificatore è sempre il primo campo nello schema
della tabella
se la clausola manca, il campo contenente gli identificatori esiste,
è generato dal sistema ma è trasparente all’utente (non
selezionabile)
Esempio

Si supponga di voler memorizzare informazioni sui
progetto a cui gli impiegati lavorano
CREATE TYPE t_progetto AS
prj#
INTEGER,
nome
VARCHAR(20),
descrizione
VARCHAR(50),
budget
INTEGER
NOT FINAL;
76
Esempio
CREATE TABLE Progetti OF t_progetto
(REF IS my_TID);
Progetti
my_TID prj# nome
16454
77
12
descrizione
Oracle ORDBMS
budget
10,000,000
Row type




78
Nessun meccanismo di incapsulazione
L’incapsulazione c’e’ solo quando un ADT è
usato come tipo di una colonna
Gli attributi del row type sono visti come
colonne della tabella (inclusa la colonna TID,
che può essere selezionata)
Le interrogazioni sono eseguite nel modo
standard
Selezione
SELECT prj#
FROM Progetti
WHERE budget > 1,000,000;
SELECT my_TID
FROM Progetti
WHERE budget > 1,000,000;
79
Inserimento
INSERT INTO Progetti(Prj#,Nome,Descrizione,Budget)
VALUES(14,’sviluppo DB’,’sviluppo DB in
Oracle’,’20,000,000);
nessun valore viene specificato per il campo
identificatore
80
Tipi riferimento




81
I row type possono essere combinati con i tipi
riferimento (REF type)
Permettono di rappresentare facilmente le
associazioni tra istanze di tipi
Tali tipi permettono ad una colonna di riferire
una tupla in un'altra relazione
Una tupla in una relazione viene identificata
tramite il suo TID
Esempio



82
Si supponga di voler memorizzare informazioni
sugli impiegati ed i progetti a cui lavorano
In un RDBMS avrei due tabelle Impiegati e
Progetti
Nella tabella Impiegati è presente una colonna
che indica il progetto a cui l’impiegato lavora
(chiave esterna)
Esempio
Impiegati
Progetti
imp#
SM123
83
...
prj#
prj#
12
12
nome
Oracle
….
Tipi riferimento

In un ORDBMS ho due opzioni in più:
–
–
definire un ADT t_progetto e usare questo come
tipo di una colonna della relazione Impiegati
(ridondanza dei dati perché lo stesso progetto può
essere memorizzato molte volte in Impiegati)
definire una tabella basata su un nuovo tipo
complesso e riferire le colonne istanza di questo
nuovo tipo

84
tipo riferimento
Tipi riferimento in SQL-99
REF (<tipo_ADT>)
[SCOPE <nome_tabella> [<reference_scope_check>]]


85
la clausola SCOPE specifica una typed table su
<tipo_ADT> e indica che i valori ammessi per il tipo
riferimento sono i puntatori alle tuple della type table
indicata
se la clausola di scope non è specificata, lo scope
implicito è rappresentato da tutti i puntatori a tuple con
row type <tipo_ADT>
Tipi riferimento in SQL-99



86
La clausola di SCOPE rappresenta una sorta
di vincolo di chiave esterna nel modello
relazionale
problema integrità referenziale anche in questo
contesto
<reference_scope_check> è una clausola che
indica come è possibile mantenere l’integrità,
analogamente a quanto visto per le chiavi
esterne
Tipi riferimento in SQL-99
<reference_scope_check> =
REFERENCES ARE [NOT] CHECKED
[ON DELETE
{CASCADE | SET NULL | SET DEFAULT |
RESTRICT | NO ACTION}]
 significato analogo al contesto relazionale
 poichè il TID è considerato immutabile, nessuna
clausola ON UPDATE
 default: RESTRICT
87
Esempio
CREATE TABLE Impiegati(
imp#
id_impiegato,
nome
VARCHAR(50),
indirizzo
t_indirizzo,
assegnamento
REF(t_progetto) SCOPE Progetti
REFERENCES ARE CHECKED
ON DELETE CASCADE);
88
Si associa un impiegato ad un progetto
Uno stesso progetto può essere associato a più impiegati
Se si cancella un progetto, si cancellano anche tutti gli impiegati
assegnati a quel progetto
Esempio
CREATE TABLE Impiegati(
imp#
id_impiegato,
nome
VARCHAR(50),
indirizzo
t_indirizzo,
assegnamento
REF(t_progetto) SCOPE Progetti
REFERENCES ARE CHECKED
ON DELETE RESTRICT);
Un progetto può essere cancellato sono se non ci sono
impiegati assegnati a quel progetto
89
Esempio
CREATE TYPE t_impiegato AS
imp#
id_impiegato,
nome
CHAR(20),
curriculum
TEXT,
indirizzo
t_indirizzo,
dipartimento
REF(t_dipartimento)
NOT FINAL;
CREATE TABLE Impiegati OF t_impiegato (REF IS my_tid);
90
Esempio
CREATE TYPE t_dipartimento AS
dip# INTEGER,
nome VARCHAR(30),
manager REF (t_impiegato)
NOT FINAL ;
CREATE TABLE Dipartimenti OF t_dipartimento (REF IS my_tid);
91
Esempio
Impiegati
imp#
nome
...
dipartimento
dip#
nome
Dipartimenti
92
manager
Esempio


93
La colonna dipartimento di Impiegati punta ad
una tupla della tabella Dipartimenti (quelle
corrispondente al dipartimento in cui lavora
l’impiegato)
La colonna impiegati di Dipartimenti punta ad
una tupla della tabella Impiegati (quella che
corrisponde al manager del dipartimento)
Tipi riferimento in SQL-99

94
Possibilità di estendere la definizione di una
typed table con ulteriori attributo con reference
type
Esempio
CREATE TABLE Progetti OF t_progetto
(prog_ref REF(t_progetto));
Progetti
Prog_ref prj# nome
12
95
descrizione
Oracle ORDBMS
budget
10,000,000
Tipi riferimento in SQL-99 manipolazione


96
Valori di tipi riferimento possono essere
confrontati solo utilizzando = e <>
Casting può essere definito tra reference type
e ADT target o tipo built-in
Tipi riferimento in SQL-99 manipolazione

Funzione di deferenziazione DEREF:
–
–

Funzione di riferimento ->
–
–
97
riceve in input un’espressione che restituisce un valore
(puntatore) per un tipo riferimento con scope non vuoto
restituisce il valore puntato dallo stesso (quindi la tupla
puntata)
riceve in input un’espressione che restituisce un valore di tipo
riferimento e un attributo dell’ADT a cui punta il tipo riferimento
restituisce il valore per quell’attributo per la tupla puntata
Esempio
SELECT manager
FROM Dipartimenti
WHERE nome = “Dischi”;
Restituisce un puntatore ad un impiegato (cioè l’oid
dell’impiegato che è manager del dipartimento Dischi)
98
Esempio
SELECT deref(manager)
FROM Dipartimenti
WHERE nome = “Dischi”;
Restituisce informazioni sul manager del dipartimento
Dischi (un’intera riga della tabella Impiegati)
99
Esempio
SELECT deref(manager).nome
FROM Dipartimenti
WHERE nome = “Dischi”;
Restituisce il nome del manager del dipartimento Dischi
10
0
Esempio
SELECT manager -> nome
FROM Dipartimenti
WHERE nome = “Dischi”;
Restituisce il nome del manager del dipartimento Dischi
Equivalente all’interrogazione precedente
10
1
Integrità referenziale



Gli identificatori vengono assegnati dal sistema
l’utente non li conosce a priori
Problema:
–

Soluzione:
–
10
2
Come garantire l’integrità referenziale di una tabella
che contiene un tipo riferimento?
si utilizzano sottoquery per determinare gli
identificatori da assegnare alle nuove tuple
Esempio
CREATE TABLE Impiegati(
imp#
id_impiegato,
nome
VARCHAR(50),
indirizzo
t_indirizzo,
assegnamento
REF(t_progetto) SCOPE Progetti
REFERENCES ARE CHECKED
ON DELETE RESTRICT);
10
3
CREATE TABLE Progetti OF t_progetto
(REF IS
My_TID,
prog_ref
REF(t_progetto));
Integrità referenziale


Quando inseriamo una tupla nella tabella
impiegati, al campo assegnamento dobbiamo
assegnare l’identificatore di una tupla della
tabella Progetti
Due passi:
–
–
10
4
inseriamo la tupla assegnando NULL al campo con
tipo riferimento
modifichiamo il contenuto del campo con un
UPDATE
Esempio
INSERT INTO Impiegati
VALUES (2,’Mario Rossi’, t_indirizzo( ),NULL);
10
5
UPDATE Impiegati
SET assegnamento =
(SELECT my_tid
FROM Progetti
WHERE nome = ‘Oracle’)
WHERE imp# = 2;
Tipi riferimento in SQL-99 restrizioni

10
6
PRIMARY KEY, UNIQUE, FOREIGN KEY non
possono essere definiti
Informazione aggiuntiva 1

10
7
Quando si crea una typed table è possibile
aggiungere vincoli di integrità sugli attributi
dell’ADT su cui si basa (purché il tipo
corrispondente lo permetta)
CREATE TABLE <nome_tabella>
OF <nome_tipo_complesso>
[(REF IS <nome_campo_TID>)
<vincoli>]
Esempio
CREATE TYPE t_progetto AS
prj#
INTEGER,
nome
VARCHAR(20),
descrizione
VARCHAR(50),
budget
INTEGER
NOT FINAL;
CREATE TABLE progetti OF t_progetto
(PRIMARY KEy (prj));
10
8
Informazioni aggiuntiva 2

I metodi possono essere:
–
metodi per le istanze (INSTANCE)

–
metodi di tipo (STATIC)


10
9
invocabili a partire da un’istanza del tipo
invocabili sul tipo
il default è INSTANCE
Esempio
CREATE TYPE t_libro AS
titolo
CHAR(20),
prezzo_vendita DECIMAL(9,2),
prezzo_acquisto DECIMAL(9,2)
NOT FINAL
INSTANCE METHOD guadagno() RETURNS DECIMAL(9,2),
STATIC METHOD max_prezzo_vendita() RETURNS DECIMAL(9,2);
11
0
Tipi collezione e tipi tupla
11
1
Tipi collezione


I tipi collezione definiscono dei contenitori per
oggetti con struttura simile
Non esiste ancora una standardizzazione
sull’insieme di tipi collezione supportati dai vari
ORDBMS
–
–
–
11
2
–
set
bag
liste
array
Tipi collezione in SQL-99

Il solo tipo collezione incluso in SQL-99 è
ARRAY
–


<dimensione> è un valore intero
Costruttore:
–

11
3
<nome campo> <tipo> ARRAY[<dimensione>]
ARRAY[<valore_1>,…,<valore_n>]
accesso:
–
<nome_campo>[i] dove i è un valore intero tra 1 e n
Tipi collezione in SQL-99


11
4
Il numero di elementi in un array è un
qualunque numero tra 0 (ARRAY[ ]) e il
numero massimo di elementi per l’array
dichiarato
implicitamente, esiste un parametro
“lunghezza”, gestito direttamente dal sistema
Esempio
CREATE TABLE Impiegati(
imp#
id_impiegato,
nome
VARCHAR(50),
competenze VARCHAR(20) ARRAY[3]);
11
5
Esempio
INSERT INTO Impiegati
VALUES (2,’Mario Rossi’,ARRAY[‘Oracle’,’Unix’,’Java’]);
SELECT *
FROM Impiegati
WHERE competenze[2] = ‘Unix’;
11
6
Esempio
CREATE TYPE t_impiegato AS
imp#id_impiegato,
nome
VARCHAR(30),
indirizzo
t_indirizzo,
manager
REF(t_impiegato),
progetti
REF(t_persona)
figli
REF(t_persona)
hobby
VARCHAR(20)
NOT FINAL;
11
7
ARRAY[10],
ARRAY[10],
ARRAY[5]
CREATE TABLE Impiegati OF t_impiegato;
Esempio
UPDATE Impiegati
SET competenze = ARRAY[‘Oracle’,’Unix’];
UPDATE Impiegati
SET competenze = ARRAY[‘SQL Server’];
11
8
il nuovo array contiene un solo elemento (la
lunghezza viene cambiata)
Tipi collezione in SQL-99 manipolazione

Casting
–

assegnamento:
–
–

usuale
troncamento genera errore
confronto:
–
11
9
cast sul tipo degli elementi e eventuale riduzione
numero elementi
=, <>
Tipi collezione in SQL-99 manipolazione

funzioni
–
concatenazione

–
cardinalità

12
0
CONCATENATE (<array_expression> WITH
<array_expression>
CARDINALITY(<array_expression>)
Tipi collezione in SQL-99 restrizioni

12
1
Per i campi di tipo array non possono essere
definiti vincoli UNIQUE, PRIMARY KEY,
FOREIGN KEY
Tipi tupla in SQL-99



12
2
SQL-99 mette a disposizione un nuovo
dominio per la rappresentazione di tipi record
chiamati row type
non richiedono la definizione di un ADT ma
possono essere direttamente associati al tipo
Tipi tupla in SQL-99

Tipo
ROW (<def campo_1>,…,<def campo_n>)

12
3
esempio:
ROW(numero_civico
via
città
stato
cap
INTEGER,
VARCHAR(50),
CHAR(20),
CHAR(2),
INTEGER)
Esempio
CREATE TABLE Impiegati (
imp#
id_impiegato,
nome
CHAR(20),
curriculum TEXT,
indirizzo ROW( numero_civico INTEGER,
12
4
via
città
stato
VARCHAR(50),
CHAR(20),
CHAR(2),
cap
INTEGER) );
Tipi tupla in SQL-99

Valori:
–

Esempio:
–


12
5
ROW(<valore tipo_1,…,valore tipo_n>)
ROW(3,’XX Settembre’,’Genova’,’IT’,16100)
anche le tuple restituite da una query sono
viste come valori del tipo tupla
le componenti di una tupla possono essere
accedure utilizzando la dot notation
Esempio
INSERT INTO Impiegati
VALUES (3,’Rossi’,NULL,
ROW(3,’XX Settembre’,’Genova’,’IT’,16100))
12
6
Esempio
CREATE TABLE Indirizzi
(
Iid
INTEGER,
Via
VARCHAR(20),
Città
VARCHAR(20),
Stato
VARCHAR(20),
cap
INTEGER);
UPDATE Impiegati
SET Indirizzo = (SELECT t from Indirizzi t WHERE Iid = 3)
WHERE nome = ‘Rossi’;
12
7
Esempio
SELECT Nome
FROM Impiegati
WHERE Indirizzo.città = ‘Genova’;
12
8
Tipi tupla in SQL-99 manipolazione

Assegnamento:
–
–

confronto:
–
–
–
12
9
stesso numero di campi
tipi compatibili
–
=, <>, <, <=, >, >=
ordinamento lessicografico, basato sui tipi delle
componenti
i valori devono avere lo stesso numero di elementi
la presenza di NULL può ovviamente generare
UNKNOWN
Esempio
13
0
ROW(1,1,1) = ROW(1,1,1)
ROW(1,1,1) = ROW(1,2,1)
ROW(1,NULL,1) = ROW(2,2,1)
ROW(1,NULL,1) = ROW(1,2,1)
ROW(1,1,1) <> ROW(1,2,1)
ROW(2,NULL,2) <> ROW(2,2,1)
ROW(2,2,1) <> ROW(2,2,1)
ROW(1,NULL,1) <> ROW(1,2,1)
ROW(1,1,1) < ROW(1,2,0)
ROW(1,NULL,1) < ROW(2,NULL,0)
ROW(1,1,1) < ROW(1,1,1)
ROW(3,NULL,1) < ROW(2,NULL,0)
ROW(1,NULL,1) < ROW(1,2,0)
ROW(NULL,1,1) < ROW(2,1,0)
TRUE
FALSE
FALSE
UNKNOWN
TRUE
TRUE
FALSE
UNKNOWN
TRUE
TRUE
FALSE
FALSE
UNKNOWN
UNKNOWN
Tipi tupla in SQL-99

13
1
Non possono essere associati a vincoli di
PRIMARY KEY, UNIQUE, FOREIGN KEY
Ereditarietà
13
2
Ereditarietà


13
3
Possibilità di definire relazioni di
supertipo/sottotipo
L’ereditarietà consente di specializzare i tipi
esistenti a seconda delle esigenze
dell’applicazione
Ereditarietà



13
4
Un sottotipo eredita gli attributi, i metodi, ed i
vincoli definiti per i suoi supertipi
Il sottotipo può raffinare il supertipo con nuovi
attributi e metodi
Nel sottotipo è anche possibile ridefinire metodi
ereditati
Ereditarietà

Si possono distinguere due tipi di ereditarietà
–
–
13
5
Ereditarietà di tipi
Ereditarietà di tabelle
Ereditarietà di tipi
Si considerino le seguenti entità:
Bus:
Camion:
modello
CHAR(20),
modello
CHAR(20),
n_licenza
INTEGER,
n_licenza
INTEGER,
ultima_revisione DATE,
ultima_revisione
DATE,
peso
n_posti
INTEGER,
prox_revisione()
DATE
INTEGER,
prox_revisione() DATE
13
6
Ereditarietà di tipi




13
7
Nel modello relazionale sono necessarie due tabelle e
due procedure
In un ORDBMS, camion e bus possono essere
considerati specializzazioni di un tipo comune: Veicolo
Si definisce quindi un tipo veicolo contenente le
caratteristiche comuni di camion e bus
Camion e bus sono definiti come sottotipi di Veicolo,
con delle caratteristiche aggiuntive
Ereditarietà di tipi in SQL-99


Per ADT
ereditarietà singola
CREATE TYPE <nome_tipo>
UNDER <nome_superclasse>
AS … altri attributi
[NOT] FINAL;

13
8
il supertipo deve essere stato dichiarato con la
clausola NOT FINAL
Ereditarietà di tipi in SQL-99

Clausola FINAL:
–

Clausola NOT FINAL:
–


13
9
non si possono definire sottotipi
si possono definire sottotipi
la clausola NOT FINAL è necessaria se la
dichiarazione non specifica una superclasse
in caso contrario si può scegliere
Esempio
CREATE TYPE t_veicolo AS
modello
CHAR(20),
n_licenza
INTEGER,
ultima_revisione DATE,
METHOD prox_revisione( ) RETURNS DATE
NOT FINAL;
14
0
Esempio
CREATE TYPE t_camion AS
UNDER t_veicolo
AS
peso
INTEGER
NOT FINAL;
14
1
CREATE TYPE t_bus AS
UNDER t_veicolo
AS
n_posti INTEGER
NOT FINAL;
Metodi & ereditarietà
CREATE TYPE t_persona AS
nome
CHAR(20),
id
INTEGER,
data_di_nascita
DATE,
indirizzo
t_indirizzo,
METHOD età() RETURNS INTEGER
NOT FINAL;
14
2
CREATE TYPE t_insegnante AS
UNDER t_persona
stipendio
DECIMAL(9,2),
data_assunzione DATE,
corso
t_corso
NOT FINAL;
Metodi & ereditarietà

I metodi sono ereditati dai sottotipi allo stesso
modo degli attributi:
CREATE TABLE Insegnanti OF t_insegnante;
SELECT nome, I.età( )
FROM Insegnanti I
WHERE stipendio > 3000;
14
3
Metodi & ereditarietà



14
4
E’ possibile ridefinire un metodo ereditato
non è possibile ridefinire gli attributi
Ad esempio al tipo t_insegnante può essere associato
un metodo età che restituisce l’anzianità di servizio
(overriding)
CREATE TYPE t_insegnante AS
UNDER t_persona
stipendio
DECIMAL(9,2),
data_assunzione DATE,
corso
t_corso
OVERRIDING METHOD età RETURNS INTEGER
NOT FINAL;
Tipi non instanziabili

La dichiarazioni di un tipo specifica se il tipo
può essere instanziato (quindi ha istanze
proprio) oppure no
CREATE TYPE <nome tipo>
AS <lista definizione attributi>
[{INSTANTIABLE|NOT INSTANTIABLE}]
{FINAL|NOT FINAL}


14
5
Il default è INSTANTIABLE
un tipo non instanziabile corrisponde ad una classe
astratta: server solo per riuso di codice
Sostituibilità




14
6
Negli OODBMS vale il principio della
sostituibilità
Un’istanza di un tipo può essere utilizzata
ovunque ci si aspetti un’istanza del suo
supertipo
Questo principio non vale negli attuali
ORDBMS
per garantire sostituibilità:
–
funzione di CAST
Ereditarietà di tabelle



14
7
Le typed tables possono essere organizzate in
gerarchie di ereditarietà
questo è possibile solo i tipi su cui si basato
sono in relazione d’ereditarietà
permette di estendere operazioni SQL alle
istanze di una tabella e di tutte le sue
sottotabelle
Esempio
CREATE TABLE persone OF t_persona;
CREATE TABLE insegnanti of t_insegnante UNDER
persone;

14
8
E’ stata creata una gerarchia tra le tabelle persone e
insegnanti
Interrogazioni




14
9
La gerarchia d’ereditarietà definita sulle tabelle
influenza i risultati delle interrogazioni
Una interrogazione fatta su una tabella si propaga
automaticamente alle sottotabelle
Lo stesso vale per le operazioni di cancellazione e
modifica mentre una operazione di inserimento
coinvolge solo una specifica tabella
se si vuole restringere l’operazione alle istanze di una
certa tabella: ONLY
Esempio
nome
data_di_nascita indirizzo
id
16/8/68
Smith 74
John
nome
15
0
86
id
Allen
82
Mark
81
Persone
3/2/48
data_di_nascita indirizzo
9/7/67
3/5/58
stipendio ….
30ml
60ml
Insegnanti
Esempio
SELECT nome
FROM Persone
WHERE data_di_nascita > 1/1/1967;

Il risultato sarà: Smith e Allen
SELECT nome
FROM ONLY Persone
WHERE data_di_nascita > 1/1/1967;
15
1

Il risultato sarà: Smith
Esempio
DELETE FROM Persone
WHERE id > 80;

15
2
Cancellerà John dalla tabella Persone e Allen e Mark
dalla tabella Insegnanti
Relazioni tra OODBMS e ORDBMS

Valori complessi
–
–

Oggetti:
–
–
–

tuple di typed tables
identificatore
incapsulazione
Classi
–
–
15
3
array
row
–
–
ADT (è presente il costruttore)
metodi (overloading e overriding)
collezioni: typed table
aggregazioni: tipi REF
Relazioni tra OODBMS e ORDBMS

Ereditarietà
–
–
–
–

linguaggio
–
–
–
15
4
singola
riuso di codice
no sostituibilità
su tipi e typed tables
SQL con estensioni per la manipolazione dei nuovi tipi di dato
accesso navigazione e associativo
un’interrogazione restituisce sempre un insieme di tuple
Progettazione di ORDBMS
15
5
Progettazione di ORDBMS

15
6
Non esiste ancora una metodologia di
progettazione consolidata come per gli
ORDBMS né tool a supporto dell’attività di
progettazione
Approccio partendo da schemi ER

Progettazione concettuale:
–

Ristrutturazione:
–
–
15
7
schema ER
inesistente
non si eliminano attributi multivalore/compositi e
gerarchie di generalizzazione
Approccio partendo da schemi ER

Progettazione logica:
–
attributo composito:


–
Ogni attributo multivalore viene tradotto in un tipo collezione
(ARRAY per SQL-99)
–
Ogni entità:


15
8
tipo tupla oppure
ADT
–
se non ha metodi può essere tradotta in una tabella, o
tramite l’opzione successiva
se ha metodi viene tradotta in un tipo su cui basare una
tabella
Le gerarchie di generalizzazione vengono tradotte
mediante relazioni di sottotipo
Approccio partendo da uno schema
OO

Ogni tipo composito (struct)
–

ogni tipo multivalore (set, bag, list)
–
15
9
tipo tupla o tipo complesso
tipo collezione
Approccio partendo da uno schema
OO

ogni classe
–
se non ha metodi:


–
se ha metodi:


–
si crea un opportuno ADT
si crea tabella basata su quell’ADT
per ogni attributo aggregato:

16
0
si crea direttamente la tabella
i tipi degli attributi vengono modificati in base a quanto sopra

aggregazione semplice: si specifica un tipo riferimento con scope
uguale alla tabella corrispondente alla classe riferita
aggregazione complessa: si specifica un tipo collezione definito
su un tipo riferimento
Aspetti relazionali ad oggetti di
Oracle 9i
16
1
Il sistema di tipi di Oracle





16
2
Non distinct type
Tipi oggetto
tipi riferimento
tipi collezione
ereditarietà
Tipi oggetto

Possibilità di definire tipi oggetto (ADT):
specifica
corpo
16
3
Dichiarazione di attributi
Specifica dei metodi
Body dei metodi
Esempio
16
4
CREATE TYPE Complesso AS OBJECT(
parte_r FLOAT,
parte_i FLOAT,
MEMBER FUNCTION somma(x Complesso) RETURNS
Complesso,
MEMBER FUNCTION sottrazione(x Complesso)
RETURNS Complesso,
MEMBER FUNCTION moltiplicazione(x Complesso)
RETURNS Complesso,
MEMBER FUNCTION divisione(x Complesso)
RETURNS Complesso);
Esempio
16
5
CREATE TYPE BODY Complesso AS
MEMBER FUNCTION somma(x Complesso)
RETURN Complesso IS
BEGIN
RETURNS Complesso(parte_r + x.parte_r,parte_i + x.parte_i);
END somma;
MEMBER FUNCTION sottrazione(x Complesso)
RETURN Complesso IS
BEGIN
RETURNS Complesso(parte_r - x.parte_r,parte_i - x.parte_i);
END sottrazione;
….
END;
Tipi oggetto

Vale tutto quello che abbiamo detto per SQL99 con le seguenti differenze:
–
–
16
6
concetto di body
incapsulazione non stretta: accesso diretto agli
attributi tramite dot notation
Metodi


Possono essere sia procedure che funzioni
due tipi:
–
MEMBER


–
STATIC

16
7
definiti sulle istanze
parametro implicito: SELF
definiti sul tipo
Esempio
CREATE TYPE Rational AS OBJECT
(num INTEGER,
den INTEGER,
MEMBER PROCEDURE normalize,
...
);
16
8
CREATE TYPE BODY Rational AS
MEMBER PROCEDURE normalize IS
g INTEGER;
BEGIN
g := gcd(SELF.num, SELF.den);
g := gcd(num, den); -- equivalent to
previous line
num := num / g;
den := den / g;
END normalize;
...
END;
Metodi speciali

Costruttori
–


16
9
come in SQL-99
Metodi MAP
Metodi ORDER
Metodi MAP



17
0
Permettono di confrontare istanze di ADT
mappando le istanze a valori di tipi built-in
(DATE, NUMBER, VARCHAR)
rappresentano quindi un casting tra un ADT e
uno dei tipi precedenti
se esiste un metodo MAP per un ADT, i
confronti su oggetti di quel tipo vengono
effettuati convertendo prima le istanze nei
valori del tipo built-in considerato
Esempio
17
1
CREATE TYPE Rectangle_typ AS OBJECT (
len NUMBER,
wid NUMBER,
MAP MEMBER FUNCTION area RETURN NUMBER,
...
);
CREATE TYPE BODY Rectangle_typ AS
MAP MEMBER FUNCTION area RETURN NUMBER IS
BEGIN
RETURN len * wid;
END area;
...
END;
Esempio

Se o1 e o2 sono istanze del tipo rectangle_typ:
–
–
17
2
o1 < o2 è equivalente a o1.area() < o2.area()
la relazione viene stabilita su due istanze del tipo
NUMBER
Metodi ORDER




17
3
Implementano una relazione d’ordine tra le istanze di
un certo tipo
hanno sempre un parametro di tipo uguale a quello per
cui il metodo viene definito
utili per confrontare tipi di dato molto complessi che
non potrebbero facilmente essere confrontati con un
metodo MAP
se esiste un metodo ORDER, il metodo viene
automaticamente chiamato quando si confrontano
istanze del tipo considerato
Metodi ORDER

L’output è sempre un intero che vale:
–
–
–


17
4
- 1 : SELF < parametro
0 : SELF = parametro
+1 : SELF > parametro
per un ADT, può esistere al più un metodo
MAP o ORDER
se nessuno dei due viene definito, il sistema
supporta solo = e <>
Esempio
CREATE TYPE Customer_typ AS OBJECT (
id NUMBER,
name VARCHAR2(20),
addr VARCHAR2(30),
ORDER MEMBER FUNCTION match (c Customer_typ) RETURN
INTEGER
);
17
5
Esempio
17
6
CREATE TYPE BODY Customer_typ AS
ORDER MEMBER FUNCTION match (c Customer_typ) RETURN
INTEGER IS
BEGIN
IF id < c.id THEN
RETURN -1; -- any negative number will do
ELSIF id > c.id THEN
RETURN 1; -- any positive number will do
ELSE
RETURN 0;
END IF;
END;
END;
Tabelle tipate

Anche in Oracle un tipo ADT può essere
utilizzato secondo due modalità:
–
–

17
7
come tipo per un attributo di una tabella
come tipo di base per la definizione di una typed
table
non può essere specificata una colonna per gli
identificatori (no clausola REF IS)
Tipi oggetto: accesso


17
8
Accesso tramite dot notation ad attributi e
metodi
se si usa la dot notation, è sempre necessario
utilizzare un alias per la tabella acceduta
Esempio
CREATE TYPE person AS OBJECT (ssno
VARCHAR(20));
CREATE TABLE ptab1 OF person;
CREATE TABLE ptab2 (c1 person);
17
9
SELECT ssno FROM ptab1 ;
SELECT c1.ssno FROM ptab2 ;
SELECT ptab2.c1.ssno FROM ptab2 ;
SELECT p.c1.ssno FROM ptab2 p ;
OK
Errore
Errore
OK
Sintassi Comandi
CREATE TYPE typename AS OBJECT
(attrname datatype {, attrname datatype});
 CREATE OR REPLACE TYPE BODY typename IS metodo {metodo};
 CREATE TABLE tablename OF typename
([attrname NOT NULL]
{,attrname NOT NULL}
[,PRIMARY KEY (attrname {,attrname })]);
 DROP TYPE typename;
 DROP TABLE tablename;
 ALTER TYPE typename REPLACE AS OBJECT (nuova definizione
tipo)
 CREATE OR REPLACE TYPE BODY typename IS metodo {metodo};

18
0
Tipi riferimento

Vale quanto visto per SQL-99
–
–
18
1
cambia un minimo la sintassi
REF <nome tipo> SCOPE IS <nome_tabella>
Tipi riferimento - manipolazione

Tre funzioni principali:
–
–
–
18
2
referenziazione ref( ): dato un oggetto di un certo
tipo, restituisce l’identificatore per quell’oggetto
dereferenziazione deref( ): dato un identificatore,
restituisce l’oggetto
value ( ): prende un alias di relazione e restituisce
l’oggetto tupla associato (utilizzando il costruttore
opportuno)
Tipi riferimento
CREATE TYPE t_persona AS OBJECT(
nome
VARCHAR2(10),
cognome
VARCHAR2(15),
data_di_nascita
DATE,
indirizzo
t_indirizzo,
madre
REF t_persona,
padre
REF t_persona);
CREATE TABLE Persone OF t_persona;
18
3
Tipi riferimento
Persone
nome cognome
18
4
...
madre
padre
Tipi riferimento
INSERT INTO Persone
VALUES(‘Mario’,’Rossi’, …,NULL,NULL);
INSERT INTO Persone
VALUES(t_persona(‘Maria’,’Bianchi’,…,NULL,NULL));
INSERT INTO Persone
VALUES(‘Giovanni’,’Rossi’,…,NULL,NULL);
18
5
Tipi riferimento
Persone
nome cognome
18
6
...
madre
padre
Mario
Rossi
NULL
NULL
Maria
Bianchi
NULL
NULL
Giovanni
Rossi
NULL
NULL
Tipi riferimento
UPDATE Persone p
SET p.madre = (SELECT ref(d1) FROM Persone d1
WHERE nome = 'Maria')
WHERE nome = ’Giovanni';
La madre di Giovanni Rossi è Maria Bianchi
18
7
Tipi riferimento
Persone
nome cognome
18
8
...
madre
padre
Mario
Rossi
NULL
NULL
Maria
Bianchi
NULL
NULL
Giovanni
Rossi
NULL
Tipi riferimento
SELECT value(p) FROM Persone p
si ottiene:
18
9
t_persona(‘Mario’,’Rossi’,NULL,NULL)
t_persona(‘Maria’,’Bianchi’,NULL,NULL)
t_persona(‘Giovanni,’Rossi’,xxxyyywww,NULL)
dove xxxyyywww è l’identificatore della tupla di Maria
Bianchi
Tipi riferimento
SELECT deref(p.madre)
FROM Persone p
WHERE nome = ‘Giovanni’;
Seleziona tutte le informazioni contenute in Persone
relative alla madre di Giovanni
restituisce
19
0
t_persona(‘Maria’,’Bianchi’,NULL,NULL)
Tipi collezione

Due tipi collezione:
–
–


19
1
nested table
varray
I tipi collezione possono avere come elementi
istanze di tipi oggetto
Un tipo oggetto può avere un attributo di tipo
collezione
Tipi collezione


Le nested table possono essere considerate
come una tabella con una sola colonna
differenze tra varray e nested table:
–
–
19
2
gli array hanno dimensione fissa mentre le nested
table hanno dimensione variabile
gli array sono memorizzati all’interno della tabella
nella quale sono utilizzati o come BLOB mentre le
nested table sono memorizzate in tabelle separate,
con una colonna in più che identifica una tupla della
tabella a cui appartengono
Tipi collezione




19
3
Non possono essere direttamente usati nella
definizione di un attributo
è sempre necessario dare un nome al tipo
collezione prima di usarlo
per ogni tipo, esiste un costruttore
per creare un’istanza, è necessario passare al
costruttore un’insieme di elementi del tipo su
cui il tipo collezione si basa
Varray - creazione
CREATE TYPE Progetto AS OBJECT(
id
INTEGER,
titolo
VARCHAR2(25),
costo
NUMBER(7,2));
CREATE TYPE Lista_Progetti AS VARRAY(50) OF Progetto;
19
4
CREATE TYPE Dipartimento AS OBJECT(
id
INTEGER,
nome
VARCHAR2(15),
budget
NUMBER(11,2),
progetti
Lista_Progetti);
CREATE TABLE Dipartimenti OF Dipartimento;
Varray - inserimento
INSERT INTO Dipartimenti
VALUES(30,’R&D’,1000000000,
Lista_Progetti(Progetto(1,’DBMS’,10000000),
Progetto(3,’C++’,20000000)));
INSERT INTO Dipartimenti
VALUES(32,’Marketing’,1000000000,
Lista_Progetti(Progetto(1,’Nuova Pubblicità’,10000000),
Progetto(3,’Incentivi Personale’,20000000)));
19
5
Nested table - creazione
CREATE TYPE Corso AS OBJECT(
id
NUMBER(4),
nome
VARCHAR2(25),
crediti
NUMBER(1));
CREATE TYPE Lista_Corsi AS TABLE of Corso;
19
6
Nested table - creazione
CREATE TYPE Dipartimento AS OBJECT(
nome
VARCHAR2(20),
direttore
VARCHAR2(20),
corsi
Lista_Corsi)
NESTED TABLE corsi STORE AS corsi_tab;
CREATE TABLE Dipartimenti OF Dipartimento
NESTED TABLE corsi STORE AS corsi_tab;
19
7
Nested Table - creazione



Notare la clausola NESTED TABLE nel lucido
precedente
Questa clausola è necessaria perché le colonne
definite come nested table sono memorizzate come
tabelle separate
Il formato generale della clausola è
NESTED TABLE colname STORE AS tablename
19
8

La tabella tablename si dice “child-table” della tabella
al cui interno è definita (detta “parent-table”)

Una child-table può essere acceduta solo tramite la
parent-table
Nested table: inserimento
INSERT INTO Dipartimenti
VALUES(‘Informatica’,’Italiani’,
Lista_Corsi(Corso(1000,’Programmazione I’,2),
Corso(1001,’Logica Matematica’,1),
Corso(1002,’Basi di Dati’,2),
Corso(1003,’Grafica’,1)));
19
9
Tipi collezione - interrogazione

Due possibilità
–
selezionare la collezione annidata

–
selezionare la collezione, non annidata



20
0
una tupla per ogni collezione
una tupla per ogni elemento della collezione
funzione TABLE
applicabili sia a VARRAY che NESTED TABLE
Selezione annidata - esempio
SELECT corsi
FROM Dipartimenti;
il risultato è
Lista_Corsi(Corso(1000,’Programmazione I’,2),
Corso(1001,’Logica Matematica’,1),
Corso(1002,’Basi di Dati’,2),
Corso(1003,’Grafica’,1))
20
1
Selezione non annidata - esempio
SELECT t.*
FROM Dipartimenti d, TABLE(d.corsi) t;
il risultato è
Corso(1000,’Programmazione I’,2)
Corso(1001,’Logica Matematica’,1)
Corso(1002,’Basi di Dati’,2)
Corso(1003,’Grafica’,1)
20
2
Funzione TABLE



20
3
La funzione TABLE prende un valore di tipo
collezione e permette di utilizzarlo come una
tabella
la query precedente realizza un join di ogni
tupla della tabella dipartimento con ogni
elemento dell’oggetto collezione
può anche essere applicata a query che
restituiscono un singolo valore di tipo
collezione
Esempio
SELECT d.nome, t.*
FROM Dipartimenti d, TABLE(d.corsi) t;
il risultato è
‘Informatica’
‘Informatica’
‘Informatica’
‘Informatica’
20
4
Corso(1000,’Programmazione I’,2)
Corso(1001,’Logica Matematica’,1)
Corso(1002,’Basi di Dati’,2)
Corso(1003,’Grafica’,1)
Esempio
SELECT * FROM
TABLE(SELECT corsi FROM Dipartimenti
WHERE nome = ‘Psicologia’);
restituisce le informazioni sui corsi del dipartimento Psicologia
SELECT crediti FROM
TABLE(SELECT corsi FROM Dipartimenti
WHERE nome = ‘Psicologia’);
restituisce i crediti di tutti i corsi del dipartimento Psicologia
20
5
le interrogazioni sono corrette se le query a cui viene applicata la
funzione TABLE restituiscono un solo elemento
Tipi collezione - DML

Nested table:
–

VARRAY:
–
–
20
6
la funzione TABLE può essere utilizzata per
modificare una collezione
–
A differenza delle nested table, i singoli elementi di
un varray non possono essere manipolati mediante
istruzioni SQL
Per selezionare o fare l’update di un certo elemento
di un VARRAY è necessario usare PL/SQL
supporto di funzioni specifiche per la manipolazione
degli array
Nested tables
UPDATE
TABLE(SELECT corsi FROM Dipartimenti
WHERE nome = ‘Psicologia’)
SET crediti = crediti + 1
WHERE id IN (2200,3540);
DELETE FROM TABLE(SELECT corsi FROM Dipartimenti
WHERE nome = ‘Inglese’) p
WHERE p.crediti = 2;
20
7
Varray
DECLARE miei_progetti lista_progetti;
SELECT progetti INTO miei_progetti.
FROM dipartimenti.
WHERE id = 30;
IF miei_progetti(i).Titolo = ‘DBMS’ …
20
8
Ereditarietà



Solo a livello di tipi
vale quanto detto per SQL-99
in più:
–
sia tipi che metodi possono essere definiti
FINAL/NOT FINAL

–
–
20
9
FINAL: overriding non possibile
sostituibilità
late binding
Sostituibilità


Possibilità di utilizzare istanze di un sottotipo in
ogni contesto in cui può essere utilizzato un
supertipo
sostituibilità a livello di
–
–
21
0
attributo
tupla
Sostituibilità a livello di attributo



21
1
Attributo con tipo REF(<tipo1>) può contenere
valori di tipo REF(<tipo2>) se <tipo2> sottotipo
di <tipo1>
Attributo con tipo ADT <tipo1> può contenere
valori di tipo ADT <tipo2> se <tipo2> sottotipo
di <tipo1>
Attributo con tipo collezione su tipo <tipo1>
può contenere valori di tipo <tipo2> se <tipo2>
sottotipo di <tipo1>
Sostituibilità a livello di tupla

21
2
Una tabella tipata su tipo <tipo1> può
contenere istanze del tipo <tipo2> se <tipo2>
sottotipo di <tipo1>
Esempio
CREATE TYPE Person_typ AS OBJECT
( ssn NUMBER,
name VARCHAR2(30),
address VARCHAR2(100)) NOT FINAL;
CREATE TYPE Student_typ UNDER Person_typ
( deptid NUMBER,
major VARCHAR2(30)) NOT FINAL;
21
3
CREATE TYPE PartTimeStudent_typ UNDER Student_typ
( numhours NUMBER);
Esempio (su attributi)
CREATE TABLE Dipartimenti
( Id INTEGER,
nome VARCHAR(20),
manager Person_typ);
INSERT INTO dipartimenti
VALUES (1,’ricerca’, Person_typ(1243, 'Bob', '121 Front St'));
INSERT INTO dipartimenti
VALUES (2,’sviluppo’,Student_typ(3456, 'Joe', '34 View', 12, 'HISTORY'));
21
4
INSERT INTO dipartimenti
VALUES (3, ‘testing’,PartTimeStudent_typ(5678, 'Tim', 13, 'PHYSICS', 20));
Esempio (su tuple)
CREATE TABLE persons OF Person_typ;
INSERT INTO persons
VALUES (Person_typ(1243, 'Bob', '121 Front St'));
INSERT INTO persons
VALUES (Student_typ(3456, 'Joe', '34 View', 12, 'HISTORY'));
INSERT INTO persons
VALUES (PartTimeStudent_typ(5678, 'Tim', 13, 'PHYSICS', 20));
21
5
Limitare sostituibilità
CREATE TABLE Dipartimenti
( Id INTEGER,
nome VARCHAR(20),
manager Person_typ)
COLUMN manager NOT SUBSTITUTABLE AT ALL LEVELS;
Manager può solo essere una persona (sottotipi non ammessi)
CREATE TABLE persons OF Person_typ NOT SUBSTITUTABLE AT
ALL LEVELS;
21
6
la tabella persons può contenere solo persone
Limitare sostituibilità
CREATE TABLE Dipartimenti
( Id INTEGER,
nome VARCHAR(20),
manager Person_typ)
COLUMN manager IS OF (ONLY Student_typ);
Si può specificare solo un sottotipo
21
7
Interrogazioni

Funzioni utili:
–
–
–
–
–

21
8
REF
DEREF
VALUE
IS OF TYPE
...
REF, DEREF, VALUE già viste
Esempio

Si consideri la tabella Dipartimenti presentata in
precedenza (senza limitazioni di sostituibilità)
SELECT *
FROM Dipartimenti p
WHERE p.manager IS OF
(Student_typ,PartTimeStudent_typ)
21
9
restituisce i dipartimenti i cui manager sono studenti o
studenti part-time
Esempio

Si consideri la tabella Persons presentata in
precedenza (senza limitazioni di sostituibilità)
SELECT *
FROM Persons p
WHERE VALUE(p) IS OF
(Student_typ,PartTimeStudent_typ)
22
0
restituisce le persone che sono studenti o studenti parttime
Differenze principali con SQL-99

Tipi collezione
–
–

Ereditarietà
–
–
22
1
SQL-99: solo ARRAY
Oracle: VARRAY e NESTED TABLE
SQL-99: su tipi e tabelle, no sostituibilità
Oracle: solo su tipi sostituibilità
Utilizzo di funzionalità OR da JDBC


22
2
Consideriamo JDBC 3 (ma molte estensioni
già presenti in JDBC 2)
Nuove interfacce per implementare mapping di
tipi object relational in tipi Java
Creazione nuovi tipi

Essendo un comando DDL, si utilizza il metodo
executeUpdate
String type = ‘CREATE TYPE t_indirizzo AS
numero_civico
INTEGER,
via
VARCHAR(50),
città
CHAR(20),
stato
CHAR(2),
cap
INTEGER’;
22
3
Statement st = con.createStatement( );
st.executeUpdate(type);
Manipolazione valori nuovi tipi da
Java

Nuove interfacce (solo per tipi standard):
–
STRUCT

–
REF

–
per mappare valori di tipo array
SQLDATA

22
4
per mappare valori di tipo riferimento
ARRAY

–
per mappare ADT
per semplificare mapping di ADT
Manipolazione valori nuovi tipi da
Java


22
5
Per ogni interfaccia, il driver prescelto
specificherà una classe che implementa
l’interfaccia
questo permette di gestire le eventuali
differenze esistenti tra DBMS
Tipi semplici



22
6
Nessuna nuova interfaccia
si manipolano utilizzando i metodi del tipo di
base
Esempio
–
CREATE TYPE id_impiegato AS INTEGER FINAL;
–
Si usano i metodi getInt e setInt per leggere e
scrivere campi di tipo id_impiegato
ADT



Le istanze di tipi ADT vengono mappate in istanze di
classe Struct
un oggetto di tipo Struct contiene un valore per ogni
attributo dell’ADT a cui si riferisce
i metodi per poter leggere e scrivere valori di attributi
con tipo ADT sono
–
–
22
7
–
ResultSet - getObject(int): per accedere attributi di tipo ADT
Struct - getAttributes(): per accedere le componenti di
un’istanza
PreparedStatement - setObject(int, Struct): per settare
parametri di tipo ADT
Esempio
CREATE TABLE Impiegati (
imp#
INTEGER PRIMARY KEY,
nome
CHAR(20),
indirizzo
t_indirizzo);
vogliamo attribuire l’indirizzo dell’impiegato 12 a Verdi
22
8
Esempio (continua)
String query = “select indirizzo from Impiegati where imp# = 12”;
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(query);
rs.next();
Struct indirizzo = (Struct) rs.getObject(1); //si ottiene l’istanza
Object[ ] ind_attr = indirizzo.getAttributes(); //si accedono gli attributi
System.out.print( “Via ” + ind_attr[1] + “ “ + ind_attr[0] + “ “ + ind_attr[2]
+ “ “ + ind_attr[4] + “ “ + ind_attr[3]);
22
9
Esempio (continua)
String up = “update Impiegati set indirizzo = ? where nome =‘Verdi’”;
PreparedStatement pst = con.prepareStatement(up);
pst.setObject(1, indirizzo);
pst.executeUpdate( );
23
0
Tipi riferimento


Le istanze di tipi riferimento (puntatori) vengono
mappate in istanze di classe Ref
i metodi per poter leggere e scrivere valori di attributi
con tipo riferimento sono
–
–
–
–
23
1
ResultSet - getRef(int): per accedere attributi di tipo riferimento
Ref - getObject( ): dato un valore di tipo riferimento, restituisce
l’oggetto puntato (solo JDBC 3)
Ref - setObject(Struct): il parametro diventa il nuovo oggetto
puntato (solo JDBC 3)
PreparedStatement - setRef(int, Ref): per settare parametri di
tipo riferimento
Esempio
CREATE TYPE t_progetto AS
prj#
INTEGER,
nome
VARCHAR(20),
descrizione
VARCHAR(50),
budget
INTEGER;
CREATE TABLE Progetti of t_progetto;
23
2
CREATE TABLE Impiegati(
imp#
INTEGER PRIMARY KEY,
nome
VARCHAR(50),
indirizzo
t_indirizzo,
assegnamento
REF(t_progetto));
Esempio (continua)

23
3
Si vuole associare il progetto dell’impiegato 12
a Verdi e visualizzare le informazioni su tale
progetto
Esempio (continua)
23
4
String query = “select assegnamento from Impiegati where imp# =
12”;
Statement st = con.createStatement(query);
ResultSet rs = st.executeQuery();
rs.next();
Ref assegn_ref = rs.getRef(1); //si ottiene l’identificatore
String update = ‘”update impiegati set assegnamento = ? where
nome = “Verdi”;
PreparedStatement pst = con.prepareStatement(update);
pst.setRef(1,assegn_ref);
pst.executeUpdate( );
Esempio (continua)
Struct progetto = (Struct) assegn_ref.getObject( );
Object [ ] prog_attr = progetto. getAttributes();
System.out.print(ind_attr[0] + “ “ + ind_attr[1] + “ “ + ind_attr[2] + “ “ +
+ ind_attr[3]);
23
5
Tipi array



Le istanze di tipi array vengono mappate in istanze di classe
Array
rappresentano puntatori alla base di dati (il contenuto non viene
copiato)
i metodi per poter leggere e scrivere valori di attributi di tipo array
sono
–
–
–
23
6
–
ResultSet - getArray(): per accedere attributi di tipo array (restituisce
un puntatore all’istanza)
Array - getArray( ): permette di copiare i dati contenuti nell’array in
strutture locali al programma
Array - getResultSet (): restituisce un result set che contiene una
tupla per ogni elemento dell’array, con due colonne. La prima
contiene l’indice (partendo da 1), la seconda il valore
PreparedStatement - setArray(int,Array): per settare parametri di tipo
Array
Esempio
CREATE TABLE Impiegati(
imp#
INTEGER PRIMARY KEY,
nome
VARCHAR(50),
indirizzo
t_indirizzo,
competenze
VARCHAR(20) ARRAY[10]);
si vogliono stampare tutte le competenze dell’impiegato 12
23
7
Esempio (continua)
String query = “select competenze from Impiegati where imp# = 12”;
Statement st = con.createStatement(query);
ResultSet rs = st.executeQuery();
rs.next();
Array comp = rs.getArray(1); //restituisce un puntatore all’array
String [ ] comp_arr = (String [ ]) comp.getArray( );
for (int i = 0; i < comp_arr.length(); i++)
System.out.print(comp_arr[i])
23
8
Tipi collezione


Come abbiamo visto i sistemi non sono
conformi allo standard per quanto riguarda i tipi
collezione
il driver potrà eventualmente utilizzare la
classe Array anche per gestire altri tipi
collezione
–
23
9
in JDBC le nested table di Oracle si mappano in
oggetti di tipo Array
SQL Data


Interfaccia
ogni classe che implementa SQLData permette
di definire un mapping esplicito tra un tipo SQL
e una classe Java
–

semplifica l’accesso agli oggetti strutturati
–
–
24
0

casting definito esplicitamente dall’utente
la lettura di un oggetto restituisce un’istanza della
classe associata dal mapping
non si devono piu’ utilizzare Struct e Object
non lo vediamo
Scarica

ppt - DISI