Basi di Dati Relazionali ad Oggetti - PowerPoint PPT Presentation

About This Presentation
Title:

Basi di Dati Relazionali ad Oggetti

Description:

Basi di Dati Relazionali ad Oggetti RDBMS: panorama attuale Gestiscono e manipolano dati semplici (tabellari) Hanno un linguaggio di interrogazione (SQL) semplice ... – PowerPoint PPT presentation

Number of Views:75
Avg rating:3.0/5.0
Slides: 241
Provided by: FlavioD6
Category:

less

Transcript and Presenter's Notes

Title: Basi di Dati Relazionali ad Oggetti


1
Basi di Dati Relazionali ad Oggetti
2
RDBMS 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)

3
RDBMS 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

4
RDBMS panorama attuale
  • Oggi il mercato mondiale dei RDBMS supera i 50
    billioni di dollari allanno, ma i RDBMS
    presentano anche alcuni limiti

5
RDBMS 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

6
RDBMS 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

7
OODBMS 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

8
OODBMS panorama attuale
  • Semplici modelli transazionali
  • Limitate funzionalità di controllo dellaccesso
  • Coprono un mercato di nicchia che richiede
    accessi navigazionali efficienti (disegno di
    chip, ecc.)

9
OODBMS 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)

10
RDBMS 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

11
Il 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

12
ORDBMS 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

13
ORDBMS 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

14
ORDBMS 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

15
ORDBMS panorama attuale
  • Le estensioni differiscono per
  • Le funzionalità che supportano
  • Il modo di realizzarle
  • Le estensioni apportate ad SQL
  • E questo nonostante SQL-99 ...

16
Lo 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

17
Lo 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

18
Nel 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

19
Estensione del sistema di tipi
20
Sistema 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)

21
Sistema 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

22
Estensione del sistema di tipi
  • Tipi semplici
  • Abstract data types
  • User-defined types
  • Tipi riferimento
  • Tipi complessi
  • tipi record e tipi collezione

23
Tipi 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)

24
Tipi 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)

25
Tipi 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

26
Esempio
  • 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)

27
Tipi 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

28
Esempio
  • CREATE TYPE id_impiegato AS INTEGER FINAL
  • CREATE TABLE Impiegati(
  • id id_impiegato,
  • nome VARCHAR(50),
  • età INTEGER,
  • id_manager id_impiegato)

29
Casting
  • 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

30
Esempio - assegnazione
  • SELECT nome
  • FROM Impiegati
  • WHERE id_manager 123 errore

31
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)

32
Esempio 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!!!

33
Casting 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

34
Funzioni 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

35
Funzioni 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 ...

36
Funzioni 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

37
Funzioni di casting in SQL-99
  • Le funzioni di casting per i tipi semplici
    vengano create automaticamento dal sistema con la
    clausola AS ASSIGNMENT

38
Casting 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)

39
Esempio
  • SELECT nome
  • FROM Impiegati
  • WHERE id_manager CAST(123 AS id_impiegato)
  • SELECT nome
  • FROM Impiegati
  • WHERE id_manager 123

40
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) gt
    CAST(USA.totale AS Decimal(8,2))

41
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
  • CREATE CAST(Euro AS Dollaro_USA)
  • WITH FUNCTION f(Euro)

42
ADT
  • Un abstract data type include
  • uno o più attributi
  • uno o più metodi

43
ADT 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

44
ADT 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

45
Esempio
  • 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

46
Esempio
  • 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

47
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

48
ADT
  • Gli ADT possono essere usati come
  • tipi di una colonna in una relazione
  • tipi di una tabella (row type)

49
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)

50
ADT come tipo di colonna
Tabella Impiegati
curriculum
indirizzo
nome
imp
numero_civico via città stato cap
51
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)

52
Metodi
  • 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

53
Metodi 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

54
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)
55
Incapsulazione
  • 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

56
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

57
Metodo 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

58
Costruttori 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

59
Esempio - 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
60
Metodi 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

61
Esempio - 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
62
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
  • .

63
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,NUL
    L,i)
  • END

64
Metodi 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

65
Esempi di selezione
  • SELECT nome
  • FROM Impiegati
  • WHERE indirizzo.città( ) Milano
  • OR indirizzo.città( ) Roma
  • SELECT indirizzo.città()
  • FROM impiegati
  • WHERE nome Smith

66
Istanze 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)

67
Selezione
  • 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)

68
Cancellazione
  • DELETE FROM Impiegati
  • WHERE indirizzo t_indirizzo(14,Sauli,Milano,
    IT,20135)

69
Update
  • UPDATE Impiegati
  • SET indirizzo indirizzo.n_civico(18)
  • WHERE imp SM123
  • UPDATE Impiegati
  • SET .
  • WHERE indirizzo
  • t_indirizzo(18,XX Settembre,Genova,IT,16100)

70
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)
  • SELECT b.libro.guadagno( )
  • FROM biblioteca b
  • WHERE b.libro.titolo() La Divina Commedia

71
Vincoli di integrità
  • Non è possibile definire vincoli di PRIMARY KEY,
    UNIQUE, FOREIGN KEY su un campo ADT
  • Motivazione
  • concettualmente tutto è OK
  • problemi legati allefficienza

72
Operazioni
  • Casting definito dallutente tra ADT e altro tipo
  • possibilità di definire funzioni di ordinamento e
    di confronto
  • non le vediamo

73
Cancellazione 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

74
Row 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

75
Row 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

76
Typed 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)

77
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

78
Esempio
  • CREATE TABLE Progetti OF t_progetto
  • (REF IS my_TID)

79
Row 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

80
Selezione
  • SELECT prj
  • FROM Progetti
  • WHERE budget gt 1,000,000
  • SELECT my_TID
  • FROM Progetti
  • WHERE budget gt 1,000,000

81
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

82
Tipi 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

83
Esempio
  • 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)

84
Esempio
Impiegati
Progetti
prj
nome
prj
imp
...
12 Oracle .
SM123 12
85
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
  • tipo riferimento

86
Tipi 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

87
Tipi 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

88
Tipi 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

89
Esempio 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

90
Esempio 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
91
Esempio 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)

92
Esempio 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)

93
Esempio 2
Impiegati
...
dipartimento
imp
nome
manager
dip
nome
Dipartimenti
94
Esempio 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)

95
Tipi 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

96
Tipi 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

97
Esempio
  • SELECT manager
  • FROM Dipartimenti
  • WHERE nome Dischi
  • Restituisce un puntatore ad un impiegato (cioè
    loid dellimpiegato che è manager del
    dipartimento Dischi)

98
Esempio
  • SELECT deref(manager)
  • FROM Dipartimenti
  • WHERE nome Dischi
  • Restituisce informazioni sul manager del
    dipartimento Dischi (unintera riga della tabella
    Impiegati)

99
Esempio
  • SELECT deref(manager).nome
  • FROM Dipartimenti
  • WHERE nome Dischi
  • Restituisce il nome del manager del dipartimento
    Dischi

100
Esempio
  • SELECT manager -gt nome
  • FROM Dipartimenti
  • WHERE nome Dischi
  • Restituisce il nome del manager del dipartimento
    Dischi
  • Equivalente allinterrogazione precedente

101
Integrità 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

102
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)
  • CREATE TABLE Progetti OF t_progetto
  • (REF IS My_TID,
  • prog_ref REF(t_progetto))

103
Integrità 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

104
Esempio
  • 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

105
Tipi riferimento in SQL-99 -restrizioni
  • PRIMARY KEY, UNIQUE, FOREIGN KEY non possono
    essere definiti

106
Informazione 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

107
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))

108
Informazioni 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

109
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)

110
Tipi collezione e tipi tupla
111
Tipi 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

112
Tipi 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

113
Tipi 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

114
Esempio
  • CREATE TABLE Impiegati(
  • imp id_impiegato,
  • nome VARCHAR(50),
  • competenze VARCHAR(20) ARRAY3)

115
Esempio
  • INSERT INTO Impiegati
  • VALUES (2,Mario Rossi,ARRAYOracle,Unix,Jav
    a)
  • SELECT
  • FROM Impiegati
  • WHERE competenze2 Unix

116
Esempio
  • 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

117
Esempio
  • UPDATE Impiegati
  • SET competenze ARRAYOracle,Unix
  • UPDATE Impiegati
  • SET competenze ARRAYSQL Server
  • il nuovo array contiene un solo elemento (la
    lunghezza viene cambiata)

118
Tipi collezione in SQL-99 - manipolazione
  • Casting
  • cast sul tipo degli elementi e eventuale
    riduzione numero elementi
  • assegnamento
  • usuale
  • troncamento genera errore
  • confronto
  • , ltgt

119
Tipi collezione in SQL-99 - manipolazione
  • funzioni
  • concatenazione
  • CONCATENATE (ltarray_expressiongt WITH
    ltarray_expressiongt
  • cardinalità
  • CARDINALITY(ltarray_expressiongt)

120
Tipi collezione in SQL-99 - restrizioni
  • Per i campi di tipo array non possono essere
    definiti vincoli UNIQUE, PRIMARY KEY, FOREIGN KEY

121
Tipi 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

122
Tipi 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)

123
Esempio
  • 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) )

124
Tipi 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

125
Esempio
  • INSERT INTO Impiegati
  • VALUES (3,Rossi,NULL,
  • ROW(3,XX Settembre,Genova,IT,16100))

126
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

127
Esempio
  • SELECT Nome
  • FROM Impiegati
  • WHERE Indirizzo.città Genova

128
Tipi 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

129
Esempio
  • 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

130
Tipi tupla in SQL-99
  • Non possono essere associati a vincoli di PRIMARY
    KEY, UNIQUE, FOREIGN KEY

131
Ereditarietà
132
Ereditarietà
  • Possibilità di definire relazioni di
    supertipo/sottotipo
  • Lereditarietà consente di specializzare i tipi
    esistenti a seconda delle esigenze
    dellapplicazione

133
Ereditarietà
  • 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

134
Ereditarietà
  • Si possono distinguere due tipi di ereditarietà
  • Ereditarietà di tipi
  • Ereditarietà di tabelle

135
Ereditarietà 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
136
Ereditarietà 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

137
Ereditarietà 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

138
Ereditarietà 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

139
Esempio
  • CREATE TYPE t_veicolo AS
  • modello CHAR(20),
  • n_licenza INTEGER,
  • ultima_revisione DATE,
  • METHOD prox_revisione( ) RETURNS DATE
  • NOT FINAL

140
Esempio
  • 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

141
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
  • CREATE TYPE t_insegnante AS
  • UNDER t_persona
  • stipendio DECIMAL(9,2),
  • data_assunzione DATE,
  • corso t_corso
  • NOT FINAL

142
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 gt 3000

143
Metodi 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

144
Tipi 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

145
Esempio 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.

146
Sostituibilità
  • 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

147
Ereditarietà 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

148
Esempio
  • 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

149
Interrogazioni
  • 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

150
Esempio
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
151
Esempio
  • 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

152
Esempio
  • DELETE FROM Persone
  • WHERE id gt 80
  • Cancellerà John dalla tabella Persone e Allen e
    Mark dalla tabella Insegnanti

153
Relazioni 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

154
Relazioni 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

155
Progettazione di ORDBMS
156
Progettazione di ORDBMS
  • Non esiste ancora una metodologia di
    progettazione consolidata come per gli ORDBMS né
    tool a supporto dellattività di progettazione

157
Approccio partendo da schemi ER
  • Progettazione concettuale
  • schema ER
  • Ristrutturazione
  • inesistente
  • non si eliminano attributi multivalore/compositi
    e gerarchie di generalizzazione

158
Approccio 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

159
Approccio partendo da uno schema OO
  • Ogni tipo composito (struct)
  • tipo tupla o tipo complesso
  • ogni tipo multivalore (set, bag, list)
  • tipo collezione

160
Approccio 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

161
PL/SQL di Oraclealcune note introduttive
162
PL/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

163
Operatori aritmetici e di confronto
Diverso ltgt,!,
Uguale
Maggiore gt
Minore lt
Somma
Sottrazione -
Moltiplicazione
Esponenziale
Divisione /
164
Simboli
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 /
165
Blocco 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)

166
Blocco 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
167
Sezione 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
168
Strutture 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
169
Gestione 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

170
Gestione 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
171
Gestione 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

172
Gestione eccezioni
ltBloccogt ltBloccogt si verifica
eccezione A when A then
codice ltBloccogt . ltBloccogt
173
Cursore
  • 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

174
Dichiarazione 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

175
Apertura 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

176
Scorrimento 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

177
Scorrimento 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

178
Chiusura 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

179
Esempio
  • 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 /

180
Aspetti relazionali ad oggetti di Oracle 9i
181
Il sistema di tipi di Oracle
  • Non distinct type
  • Tipi oggetto
  • tipi riferimento
  • tipi collezione
  • ereditarietà

182
Tipi oggetto
  • Possibilità di definire tipi oggetto (ADT)

Dichiarazione di attributi Specifica dei metodi
specifica
corpo
Body dei metodi
183
Esempio
  • 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)

184
Esempio
  • 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

185
Tipi 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

186
Metodi
  • Possono essere sia procedure che funzioni
  • due tipi
  • MEMBER
  • definiti sulle istanze
  • parametro implicito SELF
  • STATIC
  • definiti sul tipo

187
Esempio
  • 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
188
Metodi speciali
  • Costruttori
  • come in SQL-99
  • Metodi MAP
  • Metodi ORDER

189
Metodi 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

190
Esempio
  • 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

191
Esempio
  • Se o1 e o2 sono istanze del tipo rectangle_typ
  • o1 lt o2 è equivalente a o1.area() lt o2.area()
  • la relazione viene st
Write a Comment
User Comments (0)
About PowerShow.com