Title: Basi di Dati Relazionali ad Oggetti
1Basi di Dati Relazionali ad Oggetti
2RDBMS panorama attuale
- 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)
3RDBMS panorama attuale
- 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 dellaccesso
4RDBMS panorama attuale
- Oggi il mercato mondiale dei RDBMS supera i 50
billioni di dollari allanno, ma i RDBMS
presentano anche alcuni limiti
5RDBMS problemi
- Prevalentemente connessi alle caratteristiche
intrinseche del modello relazionale - 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
6RDBMS problemi
- 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
object-oriented per la progettazione e
realizzazione di software che oggi stanno
diventando pressochè uno standard
7OODBMS panorama attuale
- 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
8OODBMS panorama attuale
- Semplici modelli transazionali
- Limitate funzionalità di controllo dellaccesso
- Coprono un mercato di nicchia che richiede
accessi navigazionali efficienti (disegno di
chip, ecc.)
9OODBMS problemi
- 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)
10RDBMS vs. OODBMS
- 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
11Il modello relazionale ad oggetti
- I DBMS relazionali ad oggetti (object-relational)
nascono dallesigenza 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
12ORDBMS caratteristiche generali
- Nuovi tipi di dato
- 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
13ORDBMS caratteristiche generali
- La filosofia per la gestione dei dati è però
ancora quella relazionale - Tutti gli accessi ai dati avvengono tramite SQL
- Tutti le entità di interesse sono modellate
tramite tabelle
14ORDBMS panorama attuale
- 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 unestensione
proprietaria object-relational
15ORDBMS panorama attuale
- Le estensioni differiscono per
- Le funzionalità che supportano
- Il modo di realizzarle
- Le estensioni apportate ad SQL
- E questo nonostante SQL-99 ...
16Lo standard SQL-99
- SQL-99 è un tentativo di standardizzazione
dellestensione 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
17Lo standard SQL-99
- 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
18Nel seguito
- Discutere le caratteristiche generali di un
ORDBMS - discuteremo come queste caratteristiche vengono
gestite dallo standard - se non altrimenti specificato, utilizzeremo la
sintassi di SQL-99 - introdurremo le caratteristiche relazionali ad
oggetti di Oracle
19Estensione del sistema di tipi
20Sistema dei tipi in SQL92
- In SQL-92 i tipi di un attributo in una relazione
possono essere - 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)
21Sistema dei tipi in SQL92
- 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
22Estensione del sistema di tipi
- Tipi semplici
- Abstract data types
- User-defined types
- Tipi riferimento
- Tipi complessi
- tipi record e tipi collezione
23Tipi semplici
- 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
user-defined) - Esempio type euro decimal(8,2)
24Tipi semplici
- 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)
25Tipi semplici
- Confronti con il tipo base o con altri tipi
semplici definiti sullo stesso tipo base
richiedono operazioni di cast - Una funzione di cast deve essere specificata
quando un nuovo tipo semplice viene creato - Non è fornito alcun meccanismo di ereditarietà e
subtyping per i tipi semplici
26Esempio
- 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)
27Tipi semplici in SQL-99
- SQL-99 consente di definire tipi semplici basati
solo su tipi built-in - CREATE TYPE ltnamegt AS ltbuilt-in typegt FINAL
- Vedremo in seguito il significato della clausola
FINAL
28Esempio
- CREATE TYPE id_impiegato AS INTEGER FINAL
- CREATE TABLE Impiegati(
- id id_impiegato,
- nome VARCHAR(50),
- età INTEGER,
- id_manager id_impiegato)
29Casting
- I valori dei tipi semplici sono considerati come
distinti dai valori del tipo di base - il casting non è automatico
- le funzioni di cast (se necessarie) vanno
implementate esplicitamente, eventualmente
direttamente dal sistema
30Esempio - assegnazione
- SELECT nome
- FROM Impiegati
- WHERE id_manager 123 errore
31Esempio - 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)
32Esempio confronto
- SELECT n_cliente,n_ordine
- FROM Vendite_Europee ERP, Vendite_USA USA
- WHERE ERP.n_ordine USA.n_ordine
- AND ERP.totale gt USA.totale
errore!!!
33Casting in SQL-99
- Il DBMS definisce due funzioni di casting per
ogni nuovo tipo semplice - una per passare dal distinct type al tipo
built-in - una per passare dal tipo built-in al distinct type
34Funzioni di casting in SQL-99
- CREATE CAST (ltsource typegt AS lttarget typegt)
- WITH ltsegnatura funzionegt
- AS ASSIGNMENT
- ltsource typegt tipo input
- lttarget typegt tipo output
- almeno uno tra ltsource typegt e lttarget typegt deve
essere un tipo definito dallutente - laltro può essere un tipo qualunque
35Funzioni di casting in SQL-99
- ltsegnatura funzionegt è la segnatura di una
qualunque funzione - la funzione deve essere definita come segue
- FUNCTION ltnamegt (ltsource typegt) RETURNS lttarget
typegt - codice ...
36Funzioni di casting in SQL-99
- 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 dallutente
37Funzioni di casting in SQL-99
- Le funzioni di casting per i tipi semplici
vengano create automaticamento dal sistema con la
clausola AS ASSIGNMENT
38Casting in SQL-99
- La funzione di casting può essere invocata
- esplicitamente
- CAST(ltsource typegt as lttarget typegt)
- implicitamente, senza invocare la funzione CAST
- la stessa funzione può essere invocata per
casting su tipi built-in (esempio integer in
real)
39Esempio
- SELECT nome
- FROM Impiegati
- WHERE id_manager CAST(123 AS id_impiegato)
- SELECT nome
- FROM Impiegati
- WHERE id_manager 123
40Esempio
-
- 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) gt
CAST(USA.totale AS Decimal(8,2))
41Esempio - 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
- CREATE CAST(Euro AS Dollaro_USA)
- WITH FUNCTION f(Euro)
42ADT
- Un abstract data type include
- uno o più attributi
- uno o più metodi
43ADT in SQL-99
- Gli attributi possono essere dichiarati come gli
attributi di una tabella - possono usare clausole default
- non è possibile specificare vincolo NOT NULL
- il tipo può essere instanziabile oppure no
- vedremo meglio dopo
44ADT in SQL-99
- Se ci sono solo attributi (completeremo in
seguito la definizione) - CREATE TYPE ltnome tipogt
- AS ltlista definizione attributigt
- INSTANTIABLENOT INSTANTIABLE
- FINALNOT FINAL
- INSTANTIABLE è il default
45Esempio
- Si supponga di voler rappresentare lindirizzo di
un impiegato in un RDBMS - Sono possibili due opzioni
- indirizzo VARCHAR(n)
- rappresentare ogni componente dellindirizzo come
un attributo separato
46Esempio
- CREATE TYPE t_indirizzo AS
- numero_civico INTEGER,
- via VARCHAR(50),
- città CHAR(20),
- stato CHAR(2),
- cap INTEGER
- NOT FINAL
- t_indirizzo è un tipo complesso i cui attributi
hanno tipi predefiniti
47ADT
- Gli ADT possono anche essere annidati
- CREATE TYPE t_impiegato AS
- id id_impiegato,
- nome CHAR(20),
- curriculum TEXT,
- indirizzo t_indirizzo
- NOT FINAL
-
48ADT
- Gli ADT possono essere usati come
- tipi di una colonna in una relazione
- tipi di una tabella (row type)
49ADT 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)
50ADT come tipo di colonna
Tabella Impiegati
curriculum
indirizzo
nome
imp
numero_civico via città stato cap
51Metodi
- 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)
52Metodi
- I metodi sono funzioni definite dallutente
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
- differenza i metodi hanno un parametro implicito
che rappresenta loggetto su cui il metodo viene
invocato
53Metodi in SQL-99
- Vengono creati con il comando CREATE METHOD
- CREATE METHOD ltnome metodogt
- (lista parametri)
- RETURNS ltoutput data typegt
- FOR ltnome UDTgt
- ltcorpo metodogt
54Esempio
- 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)
55Incapsulazione
- 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 dellADT
56Incapsulazione 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
57Metodo costruttore
- 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 dellistanza
creata
58Costruttori in SQL-99
- Per ogni ADT T, esiste un costruttore T( )
- t_indirizzo() ----gt 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) - crea una nuova istanza del tipo t_indirizzo con
gli attributi inizializzati in base ai valori
forniti
59Esempio - inserimento 1
- INSERT INTO Impiegati
- VALUES(SM123,Smith,NULL,t_indirizzo(14,Sauli',
Milano,'IT', 20135))
nome
imp
curriculum
indirizzo
numero_civico via città stato cap
NULL
SM123
14 Sauli Milano IT 20135
Smith
60Metodi mutator
- Servono per modificare istanze di un ADT
-
- numero_civico(INTEGER) --gt t_indirizzo
- via(VARCHAR(50)) --gt t_indirizzo
- città(CHAR(20)) --gt t_indirizzo
- stato(CHAR(2)) --gt t_indirizzo
- cap(INTEGER) --gt t_indirizzo
- vale anche per SQL-99
61Esempio - inserimento 2
- Vogliamo inserire la tupla nella tabella
impiegati - In due passi
- creo la tupla inizializzando il campo indirizzo
- aggiorno i valori del campo indirizzo
nome
imp
curriculum
indirizzo
numero_civico via città stato cap
NULL
SM123
14 Sauli Milano IT 20135
Smith
62Esempio - 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
- .
-
63Esempio - 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,NUL
L,i) - END
64Metodi observer
- Per ogni componente di un ADT è automaticamente
creato dal sistema un metodo observer con lo
stesso nome della componente - numero_civico( ) ----gt INTEGER
- via( ) ----gt VARCHAR(50)
- città( ) ----gt CHAR(20)
- stato( ) ----gt CHAR(2)
- cap( ) ----gt INTEGER
- Anche in SQL-99
65Esempi di selezione
- SELECT nome
- FROM Impiegati
- WHERE indirizzo.città( ) Milano
- OR indirizzo.città( ) Roma
- SELECT indirizzo.città()
- FROM impiegati
- WHERE nome Smith
66Istanze di un ADT
- Dato un ADT T con attributi attr1,,attrn,
unistanza 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)
67Selezione
- La selezione di una colonna ADT restituisce
unistanza di quel tipo - SELECT indirizzo
- FROM Impiegati
- WHERE imp SM123
- si ottiene
- t_indirizzo(14,Sauli,Milano,IT,20135)
68Cancellazione
- DELETE FROM Impiegati
- WHERE indirizzo t_indirizzo(14,Sauli,Milano,
IT,20135)
69Update
- UPDATE Impiegati
- SET indirizzo indirizzo.n_civico(18)
- WHERE imp SM123
- UPDATE Impiegati
- SET .
- WHERE indirizzo
- t_indirizzo(18,XX Settembre,Genova,IT,16100)
70Uso 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)
- SELECT b.libro.guadagno( )
- FROM biblioteca b
- WHERE b.libro.titolo() La Divina Commedia
71Vincoli di integrità
- Non è possibile definire vincoli di PRIMARY KEY,
UNIQUE, FOREIGN KEY su un campo ADT - Motivazione
- concettualmente tutto è OK
- problemi legati allefficienza
72Operazioni
- Casting definito dallutente tra ADT e altro tipo
- possibilità di definire funzioni di ordinamento e
di confronto - non le vediamo
73Cancellazione e modifica tipi
- DROP TYPE ltnome_tipogt CASCADERESTRICT
- ALTER TYPE ltnome_tipogt ltoperazione_di_modificagt
- ltoperazione_di_modificagt
- ADD ATTRIBUTE ltdefinizione_attributogt
- DROP ATTRIBUTE ltnome_attributogt
74Row type
- 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
75Row type
- Permettono di
- 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
76Typed tables in SQL-99
- CREATE TABLE ltnome_tabellagt
- OF ltnome_tipo_complessogt
- (REF IS ltnome_campo_TIDgt)
- 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 allutente (non selezionabile)
77Esempio
- 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
78Esempio
- CREATE TABLE Progetti OF t_progetto
- (REF IS my_TID)
79Row type
- Nessun meccanismo di incapsulazione
- Lincapsulazione ce 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
80Selezione
- SELECT prj
- FROM Progetti
- WHERE budget gt 1,000,000
- SELECT my_TID
- FROM Progetti
- WHERE budget gt 1,000,000
81Inserimento
- 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
82Tipi riferimento
- 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
83Esempio
- 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 limpiegato lavora
(chiave esterna)
84Esempio
Impiegati
Progetti
prj
nome
prj
imp
...
12 Oracle .
SM123 12
85Tipi 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 - tipo riferimento
86Tipi riferimento in SQL-99
- REF (lttipo_ADTgt)
- SCOPE ltnome_tabellagt ltreference_scope_checkgt
- la clausola SCOPE specifica una typed table su
lttipo_ADTgt 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 lttipo_ADTgt -
87Tipi riferimento in SQL-99
- La clausola di SCOPE rappresenta una sorta di
vincolo di chiave esterna nel modello relazionale - problema integrità referenziale anche in questo
contesto - ltreference_scope_checkgt è una clausola che indica
come è possibile mantenere lintegrità,
analogamente a quanto visto per le chiavi esterne
88Tipi riferimento in SQL-99
- ltreference_scope_checkgt
- 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
89Esempio 1
- CREATE TABLE Impiegati(
- imp id_impiegato,
- nome VARCHAR(50),
- indirizzo t_indirizzo,
- assegnamento REF(t_progetto) SCOPE Progetti
- REFERENCES ARE CHECKED
- ON DELETE CASCADE)
- 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
90Esempio 1
CREATE TABLE Impiegati( imp id_impiegato, nome
VARCHAR(50), indirizzo t_indirizzo, assegname
nto 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
91Esempio 2
- 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)
92Esempio 2
- 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)
93Esempio 2
Impiegati
...
dipartimento
imp
nome
manager
dip
nome
Dipartimenti
94Esempio 2
- La colonna dipartimento di Impiegati punta ad una
tupla della tabella Dipartimenti (quelle
corrispondente al dipartimento in cui lavora
limpiegato) - La colonna impiegati di Dipartimenti punta ad una
tupla della tabella Impiegati (quella che
corrisponde al manager del dipartimento)
95Tipi riferimento in SQL-99 - manipolazione
- Valori di tipi riferimento possono essere
confrontati solo utilizzando e ltgt - Casting può essere definito tra reference type e
ADT target o tipo built-in
96Tipi riferimento in SQL-99 - manipolazione
- Funzione di deferenziazione DEREF
- riceve in input unespressione che restituisce un
valore (puntatore) per un tipo riferimento con
scope non vuoto - restituisce il valore puntato dallo stesso
(quindi la tupla puntata) - Funzione di riferimento -gt
- riceve in input unespressione che restituisce un
valore di tipo riferimento e un attributo
dellADT a cui punta il tipo riferimento - restituisce il valore per quellattributo per la
tupla puntata
97Esempio
- SELECT manager
- FROM Dipartimenti
- WHERE nome Dischi
- Restituisce un puntatore ad un impiegato (cioè
loid dellimpiegato che è manager del
dipartimento Dischi)
98Esempio
- SELECT deref(manager)
- FROM Dipartimenti
- WHERE nome Dischi
- Restituisce informazioni sul manager del
dipartimento Dischi (unintera riga della tabella
Impiegati) -
99Esempio
- SELECT deref(manager).nome
- FROM Dipartimenti
- WHERE nome Dischi
- Restituisce il nome del manager del dipartimento
Dischi
100Esempio
- SELECT manager -gt nome
- FROM Dipartimenti
- WHERE nome Dischi
- Restituisce il nome del manager del dipartimento
Dischi - Equivalente allinterrogazione precedente
101Integrità referenziale
- Gli identificatori vengono assegnati dal sistema
- lutente non li conosce a priori
- Problema
- Come garantire lintegrità referenziale di una
tabella che contiene un tipo riferimento? - Soluzione
- si utilizzano sottoquery per determinare gli
identificatori da assegnare alle nuove tuple
102Esempio
- CREATE TABLE Impiegati(
- imp id_impiegato,
- nome VARCHAR(50),
- indirizzo t_indirizzo,
- assegnamento REF(t_progetto) SCOPE Progetti
- REFERENCES ARE CHECKED
- ON DELETE RESTRICT)
- CREATE TABLE Progetti OF t_progetto
- (REF IS My_TID,
- prog_ref REF(t_progetto))
103Integrità referenziale
- Quando inseriamo una tupla nella tabella
impiegati, al campo assegnamento dobbiamo
assegnare lidentificatore di una tupla della
tabella Progetti - Due passi
- inseriamo la tupla assegnando NULL al campo con
tipo riferimento - modifichiamo il contenuto del campo con un UPDATE
104Esempio
- INSERT INTO Impiegati
- VALUES (2,Mario Rossi, t_indirizzo( ),NULL)
- UPDATE Impiegati
- SET assegnamento
- (SELECT my_tid
- FROM Progetti
- WHERE nome Oracle)
- WHERE imp 2
105Tipi riferimento in SQL-99 -restrizioni
- PRIMARY KEY, UNIQUE, FOREIGN KEY non possono
essere definiti
106Informazione aggiuntiva 1
- Quando si crea una typed table è possibile
aggiungere vincoli di integrità sugli attributi
dellADT su cui si basa (purché il tipo
corrispondente lo permetta) - CREATE TABLE ltnome_tabellagt
- OF ltnome_tipo_complessogt
- (REF IS ltnome_campo_TIDgt)
- ltvincoligt
107Esempio
- 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))
108Informazioni aggiuntiva 2
- I metodi possono essere
- metodi per le istanze (INSTANCE)
- invocabili a partire da unistanza del tipo
- metodi di tipo (STATIC)
- invocabili sul tipo
- il default è INSTANCE
109Esempio
- 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)
110Tipi collezione e tipi tupla
111Tipi collezione
- I tipi collezione definiscono dei contenitori per
oggetti con struttura simile - Non esiste ancora una standardizzazione
sullinsieme di tipi collezione supportati dai
vari ORDBMS - set
- bag
- liste
- array
112Tipi collezione in SQL-99
- Il solo tipo collezione incluso in SQL-99 è ARRAY
- ltnome campogt lttipogt ARRAYltdimensionegt
- ltdimensionegt è un valore intero
- Costruttore
- ARRAYltvalore_1gt,,ltvalore_ngt
- accesso
- ltnome_campogti dove i è un valore intero tra 1 e
n
113Tipi collezione in SQL-99
- Il numero di elementi in un array è un qualunque
numero tra 0 (ARRAY ) e il numero massimo di
elementi per larray dichiarato - implicitamente, esiste un parametro lunghezza,
gestito direttamente dal sistema
114Esempio
- CREATE TABLE Impiegati(
- imp id_impiegato,
- nome VARCHAR(50),
- competenze VARCHAR(20) ARRAY3)
115Esempio
- INSERT INTO Impiegati
- VALUES (2,Mario Rossi,ARRAYOracle,Unix,Jav
a) - SELECT
- FROM Impiegati
- WHERE competenze2 Unix
116Esempio
- CREATE TYPE t_impiegato AS
- imp id_impiegato,
- nome VARCHAR(30),
- indirizzo t_indirizzo,
- manager REF(t_impiegato),
- progetti REF(t_persona) ARRAY10,
- figli REF(t_persona) ARRAY10,
- hobby VARCHAR(20) ARRAY5
- NOT FINAL
- CREATE TABLE Impiegati OF t_impiegato
117Esempio
- UPDATE Impiegati
- SET competenze ARRAYOracle,Unix
- UPDATE Impiegati
- SET competenze ARRAYSQL Server
- il nuovo array contiene un solo elemento (la
lunghezza viene cambiata)
118Tipi collezione in SQL-99 - manipolazione
- Casting
- cast sul tipo degli elementi e eventuale
riduzione numero elementi - assegnamento
- usuale
- troncamento genera errore
- confronto
- , ltgt
119Tipi collezione in SQL-99 - manipolazione
- funzioni
- concatenazione
- CONCATENATE (ltarray_expressiongt WITH
ltarray_expressiongt - cardinalità
- CARDINALITY(ltarray_expressiongt)
120Tipi collezione in SQL-99 - restrizioni
- Per i campi di tipo array non possono essere
definiti vincoli UNIQUE, PRIMARY KEY, FOREIGN KEY
121Tipi tupla in SQL-99
- 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
122Tipi tupla in SQL-99
- Tipo
- ROW (ltdef campo_1gt,,ltdef campo_ngt)
- esempio
- ROW(numero_civico INTEGER,
- via VARCHAR(50),
- città CHAR(20),
- stato CHAR(2),
- cap INTEGER)
123Esempio
- CREATE TABLE Impiegati (
- imp id_impiegato,
- nome CHAR(20),
- curriculum TEXT,
- indirizzo ROW( numero_civico INTEGER,
- via VARCHAR(50),
- città CHAR(20),
- stato CHAR(2),
- cap INTEGER) )
124Tipi tupla in SQL-99
- Valori
- ROW(ltvalore tipo_1,,valore tipo_ngt)
- Esempio
- 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
accedute utilizzando la dot notation
125Esempio
- INSERT INTO Impiegati
- VALUES (3,Rossi,NULL,
- ROW(3,XX Settembre,Genova,IT,16100))
126Esempio
- 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
127Esempio
- SELECT Nome
- FROM Impiegati
- WHERE Indirizzo.città Genova
128Tipi tupla in SQL-99 - manipolazione
- Assegnamento
- stesso numero di campi
- tipi compatibili
- confronto
- , ltgt, lt, lt, gt, gt
- ordinamento lessicografico, basato sui tipi delle
componenti - i valori devono avere lo stesso numero di
elementi - la presenza di NULL può ovviamente generare
UNKNOWN
129Esempio
- ROW(1,1,1) ROW(1,1,1) TRUE
- ROW(1,1,1) ROW(1,2,1) FALSE
- ROW(1,NULL,1) ROW(2,2,1) FALSE
- ROW(1,NULL,1) ROW(1,2,1) UNKNOWN
- ROW(1,1,1) ltgt ROW(1,2,1) TRUE
- ROW(2,NULL,2) ltgt ROW(2,2,1) TRUE
- ROW(2,2,1) ltgt ROW(2,2,1) FALSE
- ROW(1,NULL,1) ltgt ROW(1,2,1) UNKNOWN
- ROW(1,1,1) lt ROW(1,2,0) TRUE
- ROW(1,NULL,1) lt ROW(2,NULL,0) TRUE
- ROW(1,1,1) lt ROW(1,1,1) FALSE
- ROW(3,NULL,1) lt ROW(2,NULL,0) FALSE
- ROW(1,NULL,1) lt ROW(1,2,0) UNKNOWN
- ROW(NULL,1,1) lt ROW(2,1,0) UNKNOWN
130Tipi tupla in SQL-99
- Non possono essere associati a vincoli di PRIMARY
KEY, UNIQUE, FOREIGN KEY
131Ereditarietà
132Ereditarietà
- Possibilità di definire relazioni di
supertipo/sottotipo - Lereditarietà consente di specializzare i tipi
esistenti a seconda delle esigenze
dellapplicazione
133Ereditarietà
- 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
134Ereditarietà
- Si possono distinguere due tipi di ereditarietà
- Ereditarietà di tipi
- Ereditarietà di tabelle
135Ereditarietà di tipi
Si considerino le seguenti entità
Bus modello CHAR(20), n_licenza
INTEGER, ultima_revisione DATE, n_posti
INTEGER, prox_revisione() DATE
Camion modello CHAR(20), n_licenza
INTEGER, ultima_revisione DATE, peso
INTEGER, prox_revisione() DATE
136Ereditarietà di tipi
- 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
137Ereditarietà di tipi in SQL-99
- Per ADT
- ereditarietà singola
- CREATE TYPE ltnome_tipogt
- UNDER ltnome_superclassegt
- AS altri attributi
- NOT FINAL
- il supertipo deve essere stato dichiarato con la
clausola NOT FINAL
138Ereditarietà di tipi in SQL-99
- Clausola FINAL
- non si possono definire sottotipi
- Clausola NOT FINAL
- si possono definire sottotipi
- la clausola NOT FINAL è necessaria se la
dichiarazione non specifica una superclasse - in caso contrario si può scegliere
139Esempio
- CREATE TYPE t_veicolo AS
- modello CHAR(20),
- n_licenza INTEGER,
- ultima_revisione DATE,
- METHOD prox_revisione( ) RETURNS DATE
- NOT FINAL
140Esempio
- CREATE TYPE t_camion AS
- UNDER t_veicolo
- AS
- peso INTEGER
- NOT FINAL
- CREATE TYPE t_bus AS
- UNDER t_veicolo
- AS
- n_posti INTEGER
- NOT FINAL
141Metodi ereditarietà
- CREATE TYPE t_persona AS
- nome CHAR(20),
- id INTEGER,
- data_di_nascita DATE,
- indirizzo t_indirizzo,
- METHOD età() RETURNS INTEGER
- NOT FINAL
- CREATE TYPE t_insegnante AS
- UNDER t_persona
- stipendio DECIMAL(9,2),
- data_assunzione DATE,
- corso t_corso
- NOT FINAL
142Metodi 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 gt 3000
143Metodi ereditarietà
- 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
lanzianità 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
144Tipi non instanziabili
- La dichiarazioni di un tipo specifica se il tipo
può essere instanziato (quindi ha istanze
proprio) oppure no - CREATE TYPE ltnome tipogt
- AS ltlista definizione attributigt
- INSTANTIABLENOT INSTANTIABLE
- FINALNOT FINAL
- Il default è INSTANTIABLE
- un tipo non instanziabile corrisponde ad una
classe astratta server solo per riuso di codice
145Esempio di Tipo non istanziabile
- Si consideri lesempio dei camion e bus
- Se il tipo veicolo viene introdotto per
rappresentare proprieta comuni di camion e bus,
ma tutti i veicoli sono camion o bus, allora ha
senso definire il tipo veicolo come NOT
INSTANTIABLE - I tipi camion e bus saranno dichiarati
INSTANTIABLE e conterranno tutte le istanze di
tipo veicolo.
146Sostituibilità
- Negli OODBMS vale il principio della
sostituibilità - Unistanza di un tipo può essere utilizzata
ovunque ci si aspetti unistanza del suo
supertipo - Questo principio non vale nello standard SQL-99.
Alcuni DBMS (ad esempio ORACLE) supportano il
principio di sotituibita (si vedra meglio piu
avanti) - per garantire sostituibilità
- funzione di CAST
147Ereditarietà di tabelle
- Le typed tables possono essere organizzate in
gerarchie di ereditarietà - questo è possibile solo se i tipi su cui si
basano sono in relazione dereditarietà - permette di estendere operazioni SQL alle istanze
di una tabella e di tutte le sue sottotabelle
148Esempio
- CREATE TABLE persone OF t_persona
- CREATE TABLE insegnanti of t_insegnante UNDER
persone - E stata creata una gerarchia tra le tabelle
persone e insegnanti
149Interrogazioni
- La gerarchia dereditarietà 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 loperazione alle istanze
di una certa tabella ONLY
150Esempio
nome
indirizzo
data_di_nascita
id
Persone
16/8/68
Smith
74
3/2/48
86
John
nome
indirizzo
data_di_nascita
stipendio .
id
Insegnanti
9/7/67
30ml
Allen
82
3/5/58
81
60ml
Mark
151Esempio
- SELECT nome
- FROM Persone
- WHERE data_di_nascita gt 1/1/1967
- Il risultato sarà Smith e Allen
- SELECT nome
- FROM ONLY Persone
- WHERE data_di_nascita gt 1/1/1967
- Il risultato sarà Smith
152Esempio
- DELETE FROM Persone
- WHERE id gt 80
- Cancellerà John dalla tabella Persone e Allen e
Mark dalla tabella Insegnanti
153Relazioni tra OODBMS e ORDBMS
- Valori complessi
- array
- row
- Oggetti
- tuple di typed tables
- identificatore
- incapsulazione
- Classi
- ADT (è presente il costruttore)
- metodi (overloading e overriding)
- collezioni typed table
- aggregazioni tipi REF
154Relazioni tra OODBMS e ORDBMS
- Ereditarietà
- singola
- riuso di codice
- no sostituibilità
- su tipi e typed tables
- linguaggio
- SQL con estensioni per la manipolazione dei nuovi
tipi di dato - accesso navigazione e associativo
- uninterrogazione restituisce sempre un insieme
di tuple
155Progettazione di ORDBMS
156Progettazione di ORDBMS
- Non esiste ancora una metodologia di
progettazione consolidata come per gli ORDBMS né
tool a supporto dellattività di progettazione
157Approccio partendo da schemi ER
- Progettazione concettuale
- schema ER
- Ristrutturazione
- inesistente
- non si eliminano attributi multivalore/compositi
e gerarchie di generalizzazione
158Approccio partendo da schemi ER
- Progettazione logica
- attributo composito
- tipo tupla oppure
- ADT
- Ogni attributo multivalore viene tradotto in un
tipo collezione (ARRAY per SQL-99) - Ogni entità
- se non ha metodi può essere tradotta in una
tabella, o tramite lopzione successiva - se ha metodi viene tradotta in un tipo su cui
basare una tabella - Le gerarchie di generalizzazione vengono tradotte
mediante relazioni di sottotipo
159Approccio partendo da uno schema OO
- Ogni tipo composito (struct)
- tipo tupla o tipo complesso
- ogni tipo multivalore (set, bag, list)
- tipo collezione
160Approccio partendo da uno schema OO
- ogni classe
- se non ha metodi
- si crea direttamente la tabella
- i tipi degli attributi vengono modificati in base
a quanto sopra - se ha metodi
- si crea un opportuno ADT
- si crea tabella basata su quellADT
- per ogni attributo aggregato
- 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
161PL/SQL di Oraclealcune note introduttive
162PL/SQL
- E un linguaggio procedurale definito da Oracle
che contiene i principali costrutti tipici dei
linguaggi di programmazione - PL/SQL ci serve per scrivere stored procedure,
funzioni, triggers (e altro che non ci interessa)
in Oracle
163Operatori aritmetici e di confronto
Diverso ltgt,!,
Uguale
Maggiore gt
Minore lt
Somma
Sottrazione -
Moltiplicazione
Esponenziale
Divisione /
164Simboli
Simbolo Significato Esempio
() Lista di elementi (Collins, Drab, Abramson)
Fine statement Procedure_name(arg1,arg2)
. Separatore Select from account.table_name
Stringa caratteri If var SANDRA
assegnamento A A1
concatenazione Marco Mesiti
-- / and / commenti -- Questo e un commento / Questo e un commento /
165Blocco di istruzioni
- Un programma PL/SQL e un blocco di istruzioni
con sezioni separate per - Dichiarazione di variabili
- Codice da eseguire
- Gestione delle eccezioni
- Un programma PL/SQL puo essere memorizzato nella
base di dati associandogli un nome o puo essere
digitato direttamente in una finestra di SQLPlus
(senza nome)
166Blocco di istruzioni
--blocco senza nome declare . begin end
-- stored procedure create or replace procedure
proc_name as -- dichiarazione di
variabili begin exception end
Le sezioni declare e exception sono opzionali
167Sezione dichiarazione
- Vengono dichiarati i nomi e i tipi delle
varibiali utilizzate nel programma
-- stored procedure create or replace procedure
samp (i_salary in number, i_city in string) as
accum1 number h_date datesysdate
s_flag varchar2(1) cursor mycursor is select
from where begin end
168Strutture di controllo IF,LOOP,FOR
if var1 gt 10 then var2 var1 20 else
var2 var1 var1 end if
if var1 gt 10 then var2 var1 20 end if
cnt 1 loop cnt cnt 1 if cnt gt 100
then exit end if end loop
for cnt in 1 .. 100 loop insert into T1
values (loop, cnt) end loop
169Gestione delle eccezioni
- Ogni volta che si verifica un errore
nellesecuzione di un programma PL/SQL, viene
interrotta lesecuzione del programma e il
controllo passa alla sezione di gestione delle
eccezioni - Esempi di errori predefiniti che possono essere
gestiti sono - no_data_found
- too_many_rows
- dup_val_on_index
- value_error
170Gestione delle eccezioni
CREATE PROCEDURE double ( original IN VARCHAR2,
new_string OUT VARCHAR2 ) AS BEGIN
new_string original original EXCEPTION
WHEN VALUE_ERROR THEN
dbms_output.put_line('Output buffer not long
enough.') END
171Gestione eccezioni
- Quando uno degli errori predefiniti viene
rilevato nellesecuzione di un blocco del
programma il corrispondente comando - when then viene eseguito
- Il codice che segue then viene eseguito
- Il controllo passa alla prima istruzione del
blocco successivo
172Gestione eccezioni
ltBloccogt ltBloccogt si verifica
eccezione A when A then
codice ltBloccogt . ltBloccogt
173Cursore
- Un cursore e un puntatore al risultato di una
query, mantenuto in un DBMS - Viene sempre associato allesecuzione di una
query - Le tuple o alcuni attributi delle tuple puntate
dal cursore possono essere caricate in strutture
dati locali, per poter essere manipolate - Funzioni specifiche permettono al programmatore
di manipolare i cursori - dichiarazione un cursore viene associato ad una
query - Apertura la query associata al cursore viene
eseguita - Posizionamento il cursore viene spostato
nellinsieme di tuple risultato - Chiusura il cursore viene chiuso
174Dichiarazione di cursore
- Un cursore viene dichiarato nella sezione di
dichiarazione di un blocco PL/SQL - E possibile dichiarare piu cursori
- Esempio
- declare
- CURSOR c1 IS SELECT empno,ename FROM emp
WHERE salgt2000 - CURSOR c2 IS SELECT FROM dept WHERE
deptno 10 - Si noti che il cursore non e una variabile
PL/SQL - Non e possibile assegnare un valore ad un
cursore o usare il cursore in una espressione
175Apertura di un cursore
- Quando si apre il cursore, si esegue la query e
si associa al cursore il risultato della query - DECLARE
- CURSOR c1 IS SELECT empno, ename FROM emp
WHERE salgt2000 - ...
- BEGIN
- OPEN c1
- ...
- END
176Scorrimento di cursore
- Per recuperare le tuple nel risultato della query
si utilizza il comando FETCH - Il comando FETCH recupera le tuple nellinsieme
del risultato una alla volta. - Ogni operazione di FETCH recupera la tupla
corrente e sposta il cursore in avanti di una
posizione nellinsieme del risultato - E possibile memorizzare ogni colonna della tupla
recuperata con loperazione di FETCH in opportune
variabili - FETCH c1 INTO my_empno, my_ename
177Scorrimento di cursore
- Il comando di FETCH e normalmente inserito in un
ciclo per scorrere le tuple del risultato della
query - LOOP
- FETCH c1 INTO variabili
- EXIT WHEN c1NOTFOUND
- -- si processa la tupla corrente
- END LOOP
178Chiusura di cursore
- Una volta finito di processare il risultato di
una query, attraverso il comando CLOSE si
disabilita il cursore - Una volta che il cursore e chiuso, e possibile
riaprirlo - La nuova apertura del cursore, provoca la
riesecuzione della query associata al cursore
179Esempio
- DECLARE
- my_sal empl.salaryTYPE --var del tipo della
colonna - my_ename empl.enameTYPE
- CURSOR c1 IS SELECT ename,salary
- FROM empl
- WHERE salary gt 2000
- BEGIN
- OPEN c1
- LOOP FETCH c1 INTO my_ename,my_sal
- EXIT WHEN c1NOTFOUND
- INSERT INTO RichEmpl values (my_ename,my_sal)
- DBMS_OUTPUT.PUT_LINE('NAME ' my_ename
', SALARY ' my_sal) - END LOOP
- END /
180Aspetti relazionali ad oggetti di Oracle 9i
181Il sistema di tipi di Oracle
- Non distinct type
- Tipi oggetto
- tipi riferimento
- tipi collezione
- ereditarietà
182Tipi oggetto
- Possibilità di definire tipi oggetto (ADT)
Dichiarazione di attributi Specifica dei metodi
specifica
corpo
Body dei metodi
183Esempio
- 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)
184Esempio
- 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
185Tipi oggetto
- Vale tutto quello che abbiamo detto per SQL-99
con le seguenti differenze - concetto di body
- incapsulazione non stretta accesso diretto agli
attributi tramite dot notation
186Metodi
- Possono essere sia procedure che funzioni
- due tipi
- MEMBER
- definiti sulle istanze
- parametro implicito SELF
- STATIC
- definiti sul tipo
187Esempio
- CREATE TYPE Rational AS OBJECT
- (num INTEGER,
- den INTEGER,
- MEMBER PROCEDURE normalize,
- ...
- )
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
188Metodi speciali
- Costruttori
- come in SQL-99
- Metodi MAP
- Metodi ORDER
189Metodi MAP
- 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
190Esempio
- 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
191Esempio
- Se o1 e o2 sono istanze del tipo rectangle_typ
- o1 lt o2 è equivalente a o1.area() lt o2.area()
- la relazione viene st