0 Basi di Dati Relazionali ad Oggetti. 1 RDBMS: panorama attuale Gestiscono e manipolano dati semplici (tabellari) Hanno un linguaggio di interrogazione.

Slides:



Advertisements
Presentazioni simili
1 MeDeC - Centro Demoscopico Metropolitano Provincia di Bologna - per Valutazione su alcuni servizi erogati nel.
Advertisements

DBMS (DataBase Management System)
SQL applicato a SQL Server
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità C1 Il linguaggio SQL.
Structured Query Language (SQL) Presentazione 13.1 Informatica Generale (Prof. Luca A. Ludovico)
PHP.
Universita di Camerino
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Semantica Operazionale di un frammento di Java: lo stato.
Le gerarchie di tipi.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
1 Biglietti: schema E/R. 2 Biglietti: albero degli attributi.
Esercitazioni del Corso di Sistemi Informativi Marina Mongiello
1 SQL come linguaggio di definizione di dati Eugenio Di Sciascio.
Esercitazioni del Corso di Sistemi Informativi Marina Mongiello
SQL Structured Query Language
1 IT FOR BUSINESS AND FINANCE ACCESS INTRODUCTION.
Canale A. Prof.Ciapetti AA2003/04
Corso di Informatica (Basi di Dati)
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Problemi e algoritmi Anno Accademico 2009/2010.
II ESONERO Modelli di Sistemi Biologici II 19/06/2007h12 A.9TEMA 1 1. Si illustri il metodo di stima dei parametri di popolazione a due stadi (TS) (8 pt)
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
SQL: Lezione 7 Nataliya Rassadko
0 Aspetti relazionali ad oggetti di SQL: Utilizzo di un DBMS zTre classi di applicazioni: yapplicazioni gestionali yapplicazioni navigazionali.
MP/RU 1 Dicembre 2011 ALLEGATO TECNICO Evoluzioni organizzative: organico a tendere - ricollocazioni - Orari TSC.
JavaScript: Array JavaScript: Array.
Cos’è un problema?.
Gli italiani e il marketing di relazione: promozioni, direct marketing, digital marketing UNA RICERCA QUANTITATIVA SVOLTA DA ASTRA RICERCHE PER ASSOCOMUNICAZIONE.
Modello Relazionale Definisce tipi attraverso il costruttore relazione, che organizza i dati secondo record a struttura fissa, rappresentabili attraverso.
SQL SQL (pronunciato anche come l’inglese sequel) è l’acronimo di Structured Query Language (linguaggio di interrogazione strutturato) E’ un linguaggio.
Manipolazione dei dati I comandi SQL che permettono di modificare il contenuto di una base di dati sono insertdeleteupdate insert ha la seguente sintassi:
Viste. Cosè una vista? è possibile creare un subset logico di dati o una combinazione di dati una vista è una tabella logica basata su una tabella o su.
Creazione e manipolazione tabelle. TABELLE una tabella può essere creata in qualsiasi momento,anche quando gli utenti stanno usando il database la struttura.
SQL basato su ANSI (American National Standards Institute) – standard SQL SQL – Structured Query Language è un linguaggio dichiarativo e permette di comunicare.
Basi di dati Claudia Raibulet
Corso di INFORMATICA anno scolastico 2009/10 Linguaggio SQL IDENTIFICATORI di tabelle e attributi: stringhe di lunghezza max 18 caratteri, composte da.
CHARGE PUMP Principio di Funzionamento
ORDINE DI CHIAMATA a 1minuto e 2 minuti PRINCIPALI TEMPI DELLA COMPETIZIONE ORDINE DI CHIAMATA a 1minuto e 2 minuti PRINCIPALI TEMPI DELLA COMPETIZIONE.
Array a un dimensione : vettori
ISTITUTO COMPRENSIVO “G. BATTAGLINI” MARTINA FRANCA (TA)
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Progettare un database
Un trucchetto di Moltiplicazione per il calcolo mentale
Corso di Basi di Dati Il Linguaggio SQL Home page del corso:
1 Il Linguaggio SQL Il Linguaggio SQL Prof. Lorenzo Vita, Ing. Luigi Testa.
Basi di Dati e Sistemi Informativi Il Linguaggio SQL Home page del corso:
BIOINFO3 - Lezione 201 Come in ogni corso di introduzione ad un linguaggio di programmazione, proviamo a scrivere lormai celebre primo programma di prova.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Dati e DBMS DBMS relazionali SQL Progettazione di una base di dati Programma del Corso.
1 Sky 2 Sky 3 Sky L’Universo Aperto La teoria del Big Bang prevede che, se la densità globale dell’universo non raggiunge un valore di Ωo (Omega Zero)
Didattica della fisica Nozioni basilari di fisica Luca Fiorani.
Customer satisfaction anno 2013 Ospedale di Circolo Fondazione Macchi Varese Presentazione risultati (Febbraio 2014)
DIRETTIVI UNITARI SPI-CGI – FNP-CISL - UILP-UIL TERRITORIO LODIGIANO Lunedì 23 marzo 2015 dalle ore 9,00 alle ore 13,00 Presso la sala Conferenze Confartigianato.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Interazione col DB Per interagire con una base dati da una pagina PHP occorre procedere come segue: Eseguire la connessione al DBMS MySQL in ascolto;
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
MySQL Database Management System
Database Elaborato da: Claudio Ciavarella & Marco Salvati.
OBJECT ORIENTED DATABASE introduzione. OGGETTO Ha due componenti:  stato: valore di alcune variabili (variabili di istanza)  comportamento: insieme.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Vincoli Interrelazionali Per i vincoli visti l’inserimento di un valore che li viola viene semplicemente impedito. In caso di vincoli di integrità referenziale,
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
Vincoli interrelazionali
Linguaggio SQL prima parte Linguaggio SQL prima parte A. Lorenzi, E. Cavalli INFORMATICA PER SISTEMI INFORMATIVI AZIENDALI Copyright © Istituto Italiano.
Linguaggio SQL. Linguaggi per database La diffusione del modello relazionale ha favorito l’uso prevalente di linguaggi non procedurali: in questo modo.
SQLite. Introduzione a SQLite Oltre alla possibilità di memorizzare informazioni persistenti attraverso Preferences e files, Android mette a disposizione.
Transcript della presentazione:

0 Basi di Dati Relazionali ad Oggetti

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

2 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

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

4 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

5 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

6 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

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

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

9 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

10 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

11 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

12 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

13 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

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

15 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

16 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

17 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

18 Estensione del sistema di tipi

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

20 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

21 Estensione del sistema di tipi Tipi semplici Abstract data types – User-defined types Tipi riferimento Tipi complessi: – tipi record e tipi collezione

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

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

24 Tipi semplici Confronti con il tipo base o con altri tipi semplici definiti sullo stesso tipo base richiedono operazioni di cast lORDBMS crea automaticamente una funzione di cast quando un nuovo tipo semplice viene creato Non è fornito alcun meccanismo di ereditarietà e subtyping per i tipi semplici

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

26 Tipi semplici in SQL-99 SQL-99 consente di definire tipi semplici basati solo su tipi built-in CREATE TYPE AS FINAL Vedremo in seguito il significato della clausola FINAL

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

28 Casting I valori dei distinct type 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

29 Esempio - assegnazione SELECT nome FROM Impiegati WHERE id_manager = 123; errore

30 Esempio - confronto CREATE TYPE Euro AS Decimal(8,2) FINAL; CREATE TYPE Dollaro_USA AS Decimal(8,2) FINAL; CREATE TABLE Vendite_Europee( n_clienteINTEGER, n_ordineINTEGER, totaleEuro); CREATE TABLE Vendite_USA( n_clienteINTEGER, n_ordineINTEGER, totaleDollaro_USA);

31 Esempio: confronto SELECT n_cliente,n_ordine FROM Vendite_Europee ERP, Vendite_USA USA WHERE ERP.n_ordine = USA.n_ordine AND ERP.totale > USA.totale; errore!!!

32 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

33 Funzioni di casting in SQL-99 CREATE CAST ( AS ) WITH [AS ASSIGNMENT] : tipo input : tipo output almeno uno tra e deve essere un tipo definito dallutente laltro può essere un tipo qualunque

34 è la segnatura di una qualunque funzione la funzione deve essere definita come segue: FUNCTION ( ) RETURNS … codice... Funzioni di casting in SQL-99

35 Se la clausola AS ASSIGNMENT è specificata, il casting è invocato implicitamente quando necessario per ogni coppia di tipi può esistere una sola funzione di casting definita dallutente Funzioni di casting in SQL-99

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

37 Casting in SQL-99 La funzione di casting può essere invocata: – esplicitamente CAST( as ) – implicitamente, senza invocare la funzione CAST la stessa funzione può essere invocata per casting su tipi built-in (esempio: integer in real)

38 Esempio SELECT nome FROM Impiegati WHERE id_manager = CAST(123 AS id_impiegato); SELECT nome FROM Impiegati WHERE id_manager = 123;

39 Esempio SELECT n_cliente,n_ordine FROM Vendite_Europee ERP, Vendite_USA USA WHERE ERP.n_ordine = USA.n_ordine AND CAST(ERP.totale AS Decimal(8,2) > CAST(USA.totale AS Decimal(8,2));

40 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);

41 ADT Un abstract data type include: – uno o più attributi – uno o più metodi

42 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

43 ADT in SQL-99 Se ci sono solo attributi (completeremo in seguito la definizione): CREATE TYPE AS [{INSTANTIABLE|NOT INSTANTIABLE}] {FINAL|NOT FINAL} INSTANTIABLE è il default

44 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

45 Esempio CREATE TYPE t_indirizzo AS numero_civicoINTEGER, viaVARCHAR(50), cittàCHAR(20), statoCHAR(2), capINTEGER NOT FINAL; t_indirizzo è un tipo complesso i cui attributi hanno tipi predefiniti

46 ADT Gli ADT possono anche essere annidati: CREATE TYPE t_impiegato AS idid_impiegato, nomeCHAR(20), curriculumTEXT, indirizzot_indirizzo NOT FINAL;

47 ADT Gli ADT possono essere usati come: – tipi di una colonna in una relazione – tipi di una tabella (row type)

48 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);

49 ADT come tipo di colonna Tabella Impiegati nome imp# curriculumindirizzo numero_civico via città stato cap

50 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);

51 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

52 Metodi in SQL-99 Vengono creati con il comando CREATE METHOD CREATE METHOD (lista parametri) RETURNS FOR

53 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);

54 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

55 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

56 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

57 Costruttori in SQL-99 Per ogni ADT T, esiste un costruttore T( ) t_indirizzo() ----> t_indirizzo crea una nuova istanza del tipo t_indirizzo con gli attributi inizializzati ai valori di default (tali valori possono anche essere NULL) t_indirizzo(39, Comelico', 'Milano', 'IT', 20135) crea una nuova istanza del tipo t_indirizzo con gli attributi inizializzati in base ai valori forniti

58 Esempio - inserimento 1 INSERT INTO Impiegati VALUES(SM123,Smith,NULL,t_indirizzo(14,Sauli', Milano,'IT', 20135)); nome imp#curriculumindirizzo numero_civico via città stato cap Smith SM123 NULL 14 Sauli Milano IT 20135

59 Metodi mutator Servono per modificare istanze di un ADT numero_civico(INTEGER) --> t_indirizzo via(VARCHAR(50)) --> t_indirizzo città(CHAR(20)) --> t_indirizzo stato(CHAR(2)) --> t_indirizzo cap(INTEGER) --> t_indirizzo vale anche per SQL-99

60 Esempio 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#curriculumindirizzo numero_civico via città stato cap Smith SM123 NULL 14 Sauli Milano IT 20135

61 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; ….

62 Esempio - inserimento 3 BEGIN DECLARE i t_indirizzo; SET i = t_indirizzo(); SET i = i.numero_civico(14); SET i = i.via(Sauli); SET i = i.città(Milano); SET i = i.stato(IT); SET i = i.cap(20135); INSERT INTO impiegati VALUES (SM123,Smith,NULL,i); END;

63 Metodi observer Per ogni componente di un ADT è automaticamente creato dal sistema un metodo observer con lo stesso nome della componente: numero_civico( ) ----> INTEGER via( ) ----> VARCHAR(50) città( ) ----> CHAR(20) stato( ) ----> CHAR(2) cap( ) ----> INTEGER Anche in SQL-99

64 Esempi di selezione SELECT nome FROM Impiegati WHERE indirizzo.città( ) = Milano OR indirizzo.città( ) = Roma; SELECT indirizzo.città() FROM impiegati WHERE nome = Smith;

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

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

67 Cancellazione DELETE FROM Impiegati WHERE indirizzo = t_indirizzo(14,Sauli,Milano,IT,20135);

68 Update UPDATE Impiegati SET indirizzo = indirizzo.n_civico(18) WHERE imp# = SM123 ; UPDATE Impiegati WHERE indirizzo = t_indirizzo(18,XX Settembre,Genova,IT,16100);

69 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;

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

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

72 Cancellazione e modifica tipi DROP TYPE {CASCADE|RESTRICT}; ALTER TYPE ; ::= ADD ATTRIBUTE | DROP ATTRIBUTE

73 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

74 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

75 Typed tables in SQL-99 CREATE TABLE OF [(REF IS )] 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)

76 Esempio Si supponga di voler memorizzare informazioni sui progetto a cui gli impiegati lavorano CREATE TYPE t_progetto AS prj#INTEGER, nomeVARCHAR(20), descrizioneVARCHAR(50), budgetINTEGER NOT FINAL;

77 Esempio CREATE TABLE Progetti OF t_progetto (REF IS my_TID); Progetti prj# Oracle ORDBMS nome descrizione budget 10,000,000 my_TID

78 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

79 Selezione SELECT prj# FROM Progetti WHERE budget > 1,000,000; SELECT my_TID FROM Progetti WHERE budget > 1,000,000;

80 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

81 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

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

83 Esempio Impiegati prj# Progetti prj# SM Oracle …. imp#... nome

84 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

85 Tipi riferimento in SQL-99 REF ( ) [SCOPE [ ]] la clausola SCOPE specifica una typed table su 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

86 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 è una clausola che indica come è possibile mantenere lintegrità, analogamente a quanto visto per le chiavi esterne

87 Tipi riferimento in SQL-99 = 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

88 Esempio CREATE TABLE Impiegati( imp#id_impiegato, nomeVARCHAR(50), indirizzot_indirizzo, assegnamentoREF(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

89 Esempio CREATE TABLE Impiegati( imp#id_impiegato, nomeVARCHAR(50), indirizzot_indirizzo, assegnamentoREF(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

90 Esempio CREATE TYPE t_impiegato AS imp#id_impiegato, nomeCHAR(20), curriculumTEXT, indirizzot_indirizzo, dipartimentoREF(t_dipartimento) NOT FINAL; CREATE TABLE Impiegati OF t_impiegato (REF IS my_tid);

91 Esempio CREATE TYPE t_dipartimento AS dip# INTEGER, nome VARCHAR(30), manager REF (t_impiegato) NOT FINAL ; CREATE TABLE Dipartimenti OF t_dipartimento (REF IS my_tid);

92 Esempio Impiegati imp# nome... dipartimento Dipartimenti dip# nome manager

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

94 Tipi riferimento in SQL-99 Possibilità di estendere la definizione di una typed table con ulteriori attributo con reference type

95 Esempio CREATE TABLE Progetti OF t_progetto (prog_ref REF(t_progetto)); Progetti prj# 12 Oracle ORDBMS nome descrizione budget 10,000,000 Prog_ref

96 Tipi riferimento in SQL-99 - manipolazione Valori di tipi riferimento possono essere confrontati solo utilizzando = e <> Casting può essere definito tra reference type e ADT target o tipo built-in

97 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 -> – 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

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

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

100 Esempio SELECT deref(manager).nome FROM Dipartimenti WHERE nome = Dischi; Restituisce il nome del manager del dipartimento Dischi

101 Esempio SELECT manager -> nome FROM Dipartimenti WHERE nome = Dischi; Restituisce il nome del manager del dipartimento Dischi Equivalente allinterrogazione precedente

102 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

103 Esempio CREATE TABLE Impiegati( imp#id_impiegato, nomeVARCHAR(50), indirizzot_indirizzo, assegnamentoREF(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));

104 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

105 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;

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

107 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 OF [(REF IS ) ]

108 Esempio CREATE TYPE t_progetto AS prj#INTEGER, nomeVARCHAR(20), descrizioneVARCHAR(50), budgetINTEGER NOT FINAL; CREATE TABLE progetti OF t_progetto (PRIMARY KEy (prj));

109 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

110 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);

111 Tipi collezione e tipi tupla

112 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

113 Tipi collezione in SQL-99 Il solo tipo collezione incluso in SQL-99 è ARRAY – ARRAY[ ] è un valore intero Costruttore: – ARRAY[,…, ] accesso: – [i] dove i è un valore intero tra 1 e n

114 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

115 Esempio CREATE TABLE Impiegati( imp# id_impiegato, nome VARCHAR(50), competenzeVARCHAR(20) ARRAY[3]);

116 Esempio INSERT INTO Impiegati VALUES (2,Mario Rossi,ARRAY[Oracle,Unix,Java]); SELECT * FROM Impiegati WHERE competenze[2] = Unix;

117 Esempio CREATE TYPE t_impiegato AS imp#id_impiegato, nome VARCHAR(30), indirizzot_indirizzo, managerREF(t_impiegato), progettiREF(t_persona) ARRAY[10], figliREF(t_persona)ARRAY[10], hobbyVARCHAR(20)ARRAY[5] NOT FINAL; CREATE TABLE Impiegati OF t_impiegato;

118 Esempio UPDATE Impiegati SET competenze = ARRAY[Oracle,Unix]; UPDATE Impiegati SET competenze = ARRAY[SQL Server]; il nuovo array contiene un solo elemento (la lunghezza viene cambiata)

119 Tipi collezione in SQL-99 - manipolazione Casting – cast sul tipo degli elementi e eventuale riduzione numero elementi assegnamento: – usuale – troncamento genera errore confronto: – =, <>

120 Tipi collezione in SQL-99 - manipolazione funzioni – concatenazione CONCATENATE ( WITH – cardinalità CARDINALITY( )

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

122 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

123 Tipi tupla in SQL-99 Tipo ROW (,…, ) esempio: ROW( numero_civicoINTEGER, viaVARCHAR(50), cittàCHAR(20), statoCHAR(2), capINTEGER)

124 Esempio CREATE TABLE Impiegati ( imp# id_impiegato, nome CHAR(20), curriculum TEXT, indirizzo ROW( numero_civicoINTEGER, viaVARCHAR(50), cittàCHAR(20), statoCHAR(2), capINTEGER) );

125 Tipi tupla in SQL-99 Valori: – ROW( ) 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 accedure utilizzando la dot notation

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

127 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;

128 Esempio SELECT Nome FROM Impiegati WHERE Indirizzo.città = Genova;

129 Tipi tupla in SQL-99 - manipolazione Assegnamento: – stesso numero di campi – tipi compatibili confronto: – =, <>,, >= – ordinamento lessicografico, basato sui tipi delle componenti – i valori devono avere lo stesso numero di elementi – la presenza di NULL può ovviamente generare UNKNOWN

130 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) <> ROW(1,2,1)TRUE ROW(2,NULL,2) <> ROW(2,2,1)TRUE ROW(2,2,1) <> ROW(2,2,1)FALSE ROW(1,NULL,1) <> ROW(1,2,1)UNKNOWN ROW(1,1,1) < ROW(1,2,0)TRUE ROW(1,NULL,1) < ROW(2,NULL,0)TRUE ROW(1,1,1) < ROW(1,1,1)FALSE ROW(3,NULL,1) < ROW(2,NULL,0)FALSE ROW(1,NULL,1) < ROW(1,2,0)UNKNOWN ROW(NULL,1,1) < ROW(2,1,0)UNKNOWN

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

132 Ereditarietà

133 Possibilità di definire relazioni di supertipo/sottotipo Lereditarietà consente di specializzare i tipi esistenti a seconda delle esigenze dellapplicazione

134 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

135 Ereditarietà Si possono distinguere due tipi di ereditarietà – Ereditarietà di tipi – Ereditarietà di tabelle

136 Ereditarietà di tipi Si considerino le seguenti entità: Camion: modello CHAR(20), n_licenza INTEGER, ultima_revisione DATE, peso INTEGER, prox_revisione() DATE Bus: modello CHAR(20), n_licenza INTEGER, ultima_revisione DATE, n_posti INTEGER, prox_revisione() DATE

137 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

138 Ereditarietà di tipi in SQL-99 Per ADT ereditarietà singola CREATE TYPE UNDER AS … altri attributi [NOT] FINAL; il supertipo deve essere stato dichiarato con la clausola NOT FINAL

139 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

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

141 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;

142 Metodi & ereditarietà CREATE TYPE t_persona AS nomeCHAR(20), idINTEGER, data_di_nascitaDATE, indirizzot_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;

143 Metodi & ereditarietà I metodi sono ereditati dai sottotipi allo stesso modo degli attributi: CREATE TABLE Insegnanti OF t_insegnante; SELECT nome, I.età( ) FROM Insegnanti I WHERE stipendio > 3000;

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

145 Tipi non instanziabili La dichiarazioni di un tipo specifica se il tipo può essere instanziato (quindi ha istanze proprio) oppure no CREATE TYPE AS [{INSTANTIABLE|NOT INSTANTIABLE}] {FINAL|NOT FINAL} Il default è INSTANTIABLE un tipo non instanziabile corrisponde ad una classe astratta: server solo per riuso di codice

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 negli attuali ORDBMS per garantire sostituibilità: – funzione di CAST

147 Ereditarietà di tabelle Le typed tables possono essere organizzate in gerarchie di ereditarietà questo è possibile solo i tipi su cui si basato 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 Persone nome id data_di_nascita indirizzo Smith74 16/8/68 John 86 3/2/48 nome id data_di_nascita indirizzo Allen82 9/7/67 Mark 81 3/5/58 Insegnanti stipendio …. 30ml 60ml

151 Esempio SELECT nome FROM Persone WHERE data_di_nascita > 1/1/1967; Il risultato sarà: Smith e Allen SELECT nome FROM ONLY Persone WHERE data_di_nascita > 1/1/1967; Il risultato sarà: Smith

152 Esempio DELETE FROM Persone WHERE id > 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 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 Aspetti relazionali ad oggetti di Oracle 9i

162 Il sistema di tipi di Oracle Non distinct type Tipi oggetto tipi riferimento tipi collezione ereditarietà

163 Tipi oggetto Possibilità di definire tipi oggetto (ADT): specifica Dichiarazione di attributi Specifica dei metodi corpo Body dei metodi

164 Esempio CREATE TYPE Complesso AS OBJECT( parte_rFLOAT, parte_iFLOAT, 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);

165 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;

166 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

167 Metodi Possono essere sia procedure che funzioni due tipi: – MEMBER definiti sulle istanze parametro implicito: SELF – STATIC definiti sul tipo

168 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;

169 Metodi speciali Costruttori – come in SQL-99 Metodi MAP Metodi ORDER

170 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

171 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;

172 Esempio Se o1 e o2 sono istanze del tipo rectangle_typ: – o1 < o2 è equivalente a o1.area() < o2.area() – la relazione viene stabilita su due istanze del tipo NUMBER

173 Metodi ORDER Implementano una relazione dordine tra le istanze di un certo tipo hanno sempre un parametro di tipo uguale a quello per cui il metodo viene definito utili per confrontare tipi di dato molto complessi che non potrebbero facilmente essere confrontati con un metodo MAP se esiste un metodo ORDER, il metodo viene automaticamente chiamato quando si confrontano istanze del tipo considerato

174 Metodi ORDER Loutput è sempre un intero che vale: – - 1 : SELF < parametro – 0 : SELF = parametro – +1 : SELF > parametro per un ADT, può esistere al più un metodo MAP o ORDER se nessuno dei due viene definito, il sistema supporta solo = e <>

175 Esempio CREATE TYPE Customer_typ AS OBJECT ( id NUMBER, name VARCHAR2(20), addr VARCHAR2(30), ORDER MEMBER FUNCTION match (c Customer_typ) RETURN INTEGER );

176 Esempio CREATE TYPE BODY Customer_typ AS ORDER MEMBER FUNCTION match (c Customer_typ) RETURN INTEGER IS BEGIN IF id < c.id THEN RETURN -1; -- any negative number will do ELSIF id > c.id THEN RETURN 1; -- any positive number will do ELSE RETURN 0; END IF; END;

177 Tabelle tipate Anche in Oracle un tipo ADT può essere utilizzato secondo due modalità: – come tipo per un attributo di una tabella – come tipo di base per la definizione di una typed table non può essere specificata una colonna per gli identificatori (no clausola REF IS)

178 Tipi oggetto: accesso Accesso tramite dot notation ad attributi e metodi se si usa la dot notation, è sempre necessario utilizzare un alias per la tabella acceduta

179 Esempio CREATE TYPE person AS OBJECT (ssno VARCHAR(20)); CREATE TABLE ptab1 OF person; CREATE TABLE ptab2 (c1 person); SELECT ssno FROM ptab1 ; OK SELECT c1.ssno FROM ptab2 ; Errore SELECT ptab2.c1.ssno FROM ptab2 ; Errore SELECT p.c1.ssno FROM ptab2 p ; OK

180 Sintassi Comandi CREATE TYPE typename AS OBJECT (attrname datatype {, attrname datatype}); CREATE OR REPLACE TYPE BODY typename IS metodo {metodo}; CREATE TABLE tablename OF typename ([attrname NOT NULL] {,attrname NOT NULL} [,PRIMARY KEY (attrname {,attrname })]); DROP TYPE typename; DROP TABLE tablename; ALTER TYPE typename REPLACE AS OBJECT (nuova definizione tipo) CREATE OR REPLACE TYPE BODY typename IS metodo {metodo};

181 Tipi riferimento Vale quanto visto per SQL-99 – cambia un minimo la sintassi – REF SCOPE IS

182 Tipi riferimento - manipolazione Tre funzioni principali: – referenziazione ref( ): dato un oggetto di un certo tipo, restituisce lidentificatore per quelloggetto – dereferenziazione deref( ): dato un identificatore, restituisce loggetto – value ( ): prende un alias di relazione e restituisce loggetto tupla associato (utilizzando il costruttore opportuno)

183 Tipi riferimento CREATE TYPE t_persona AS OBJECT( nome VARCHAR2(10), cognomeVARCHAR2(15), data_di_nascitaDATE, indirizzot_indirizzo, madreREF t_persona, padreREF t_persona); CREATE TABLE Persone OF t_persona;

184 Tipi riferimento Persone nome cognome... madrepadre

185 Tipi riferimento INSERT INTO Persone VALUES(Mario,Rossi, …,NULL,NULL); INSERT INTO Persone VALUES(t_persona(Maria,Bianchi,…,NULL,NULL)); INSERT INTO Persone VALUES(Giovanni,Rossi,…,NULL,NULL);

186 Tipi riferimento Persone nome cognome... madrepadre Mario Rossi NULL Maria Bianchi NULL Giovanni Rossi NULL

187 Tipi riferimento UPDATE Persone p SET p.madre = (SELECT ref(d1) FROM Persone d1 WHERE nome = 'Maria') WHERE nome = Giovanni'; La madre di Giovanni Rossi è Maria Bianchi

188 Tipi riferimento Persone nome cognome... madrepadre Mario Rossi NULL Maria Bianchi NULL Giovanni Rossi NULL

189 Tipi riferimento SELECT value(p) FROM Persone p si ottiene: t_persona(Mario,Rossi,NULL,NULL) t_persona(Maria,Bianchi,NULL,NULL) t_persona(Giovanni,Rossi,xxxyyywww,NULL) dove xxxyyywww è lidentificatore della tupla di Maria Bianchi

190 SELECT deref(p.madre) FROM Persone p WHERE nome = Giovanni; Seleziona tutte le informazioni contenute in Persone relative alla madre di Giovanni restituisce t_persona(Maria,Bianchi,NULL,NULL) Tipi riferimento

191 Tipi collezione Due tipi collezione: – nested table – varray I tipi collezione possono avere come elementi istanze di tipi oggetto Un tipo oggetto può avere un attributo di tipo collezione

192 Tipi collezione Le nested table possono essere considerate come una tabella con una sola colonna differenze tra varray e nested table: – gli array hanno dimensione fissa mentre le nested table hanno dimensione variabile – gli array sono memorizzati allinterno della tabella nella quale sono utilizzati o come BLOB mentre le nested table sono memorizzate in tabelle separate, con una colonna in più che identifica una tupla della tabella a cui appartengono

193 Tipi collezione Non possono essere direttamente usati nella definizione di un attributo è sempre necessario dare un nome al tipo collezione prima di usarlo per ogni tipo, esiste un costruttore per creare unistanza, è necessario passare al costruttore uninsieme di elementi del tipo su cui il tipo collezione si basa

194 Varray - creazione CREATE TYPE Progetto AS OBJECT( idINTEGER, titoloVARCHAR2(25), costo NUMBER(7,2)); CREATE TYPE Lista_Progetti AS VARRAY(50) OF Progetto; CREATE TYPE Dipartimento AS OBJECT( idINTEGER, nomeVARCHAR2(15), budgetNUMBER(11,2), progettiLista_Progetti); CREATE TABLE Dipartimenti OF Dipartimento;

195 Varray - inserimento INSERT INTO Dipartimenti VALUES(30,R&D, , Lista_Progetti(Progetto(1,DBMS, ), Progetto(3,C++, ))); INSERT INTO Dipartimenti VALUES(32,Marketing, , Lista_Progetti(Progetto(1,Nuova Pubblicità, ), Progetto(3,Incentivi Personale, )));

196 Nested table - creazione CREATE TYPE Corso AS OBJECT( idNUMBER(4), nomeVARCHAR2(25), crediti NUMBER(1)); CREATE TYPE Lista_Corsi AS TABLE of Corso;

197 Nested table - creazione CREATE TYPE Dipartimento AS OBJECT( nomeVARCHAR2(20), direttoreVARCHAR2(20), corsiLista_Corsi) NESTED TABLE corsi STORE AS corsi_tab; CREATE TABLE Dipartimenti OF Dipartimento NESTED TABLE corsi STORE AS corsi_tab;

198 Nested Table - creazione Notare la clausola NESTED TABLE nel lucido precedente Questa clausola è necessaria perché le colonne definite come nested table sono memorizzate come tabelle separate Il formato generale della clausola è NESTED TABLE colname STORE AS tablename La tabella tablename si dice child-table della tabella al cui interno è definita (detta parent-table) Una child-table può essere acceduta solo tramite la parent-table

199 Nested table: inserimento INSERT INTO Dipartimenti VALUES(Informatica,Italiani, Lista_Corsi(Corso(1000,Programmazione I,2), Corso(1001,Logica Matematica,1), Corso(1002,Basi di Dati,2), Corso(1003,Grafica,1)));

200 Tipi collezione - interrogazione Due possibilità – selezionare la collezione annidata una tupla per ogni collezione – selezionare la collezione, non annidata una tupla per ogni elemento della collezione funzione TABLE applicabili sia a VARRAY che NESTED TABLE

201 Selezione annidata - esempio SELECT corsi FROM Dipartimenti; il risultato è Lista_Corsi(Corso(1000,Programmazione I,2), Corso(1001,Logica Matematica,1), Corso(1002,Basi di Dati,2), Corso(1003,Grafica,1))

202 Selezione non annidata - esempio SELECT t.* FROM Dipartimenti d, TABLE(d.corsi) t; il risultato è Corso(1000,Programmazione I,2) Corso(1001,Logica Matematica,1) Corso(1002,Basi di Dati,2) Corso(1003,Grafica,1)

203 Funzione TABLE La funzione TABLE prende un valore di tipo collezione e permette di utilizzarlo come una tabella la query precedente realizza un join di ogni tupla della tabella dipartimento con ogni elemento delloggetto collezione può anche essere applicata a query che restituiscono un singolo valore di tipo collezione

204 Esempio SELECT d.nome, t.* FROM Dipartimenti d, TABLE(d.corsi) t; il risultato è InformaticaCorso(1000,Programmazione I,2) Informatica Corso(1001,Logica Matematica,1) Informatica Corso(1002,Basi di Dati,2) Informatica Corso(1003,Grafica,1)

205 Esempio SELECT * FROM TABLE(SELECT corsi FROM Dipartimenti WHERE nome = Psicologia); restituisce le informazioni sui corsi del dipartimento Psicologia SELECT crediti FROM TABLE(SELECT corsi FROM Dipartimenti WHERE nome = Psicologia); restituisce i crediti di tutti i corsi del dipartimento Psicologia le interrogazioni sono corrette se le query a cui viene applicata la funzione TABLE restituiscono un solo elemento

206 Tipi collezione - DML Nested table: – la funzione TABLE può essere utilizzata per modificare una collezione VARRAY: – A differenza delle nested table, i singoli elementi di un varray non possono essere manipolati mediante istruzioni SQL – Per selezionare o fare lupdate di un certo elemento di un VARRAY è necessario usare PL/SQL – supporto di funzioni specifiche per la manipolazione degli array

207 Nested tables UPDATE TABLE(SELECT corsi FROM Dipartimenti WHERE nome = Psicologia) SET crediti = crediti + 1 WHERE id IN (2200,3540); DELETE FROM TABLE(SELECT corsi FROM Dipartimenti WHERE nome = Inglese) p WHERE p.crediti = 2;

208 Varray DECLARE miei_progetti lista_progetti; SELECT progetti INTO miei_progetti. FROM dipartimenti. WHERE id = 30; IF miei_progetti(i).Titolo = DBMS …

209 Ereditarietà Solo a livello di tipi vale quanto detto per SQL-99 in più: – sia tipi che metodi possono essere definiti FINAL/NOT FINAL FINAL: overriding non possibile – sostituibilità – late binding

210 Sostituibilità Possibilità di utilizzare istanze di un sottotipo in ogni contesto in cui può essere utilizzato un supertipo sostituibilità a livello di – attributo – tupla

211 Sostituibilità a livello di attributo Attributo con tipo REF( ) può contenere valori di tipo REF( ) se sottotipo di Attributo con tipo ADT può contenere valori di tipo ADT se sottotipo di Attributo con tipo collezione su tipo può contenere valori di tipo se sottotipo di

212 Sostituibilità a livello di tupla Una tabella tipata su tipo può contenere istanze del tipo se sottotipo di

213 Esempio CREATE TYPE Person_typ AS OBJECT ( ssn NUMBER, name VARCHAR2(30), address VARCHAR2(100)) NOT FINAL; CREATE TYPE Student_typ UNDER Person_typ ( deptid NUMBER, major VARCHAR2(30)) NOT FINAL; CREATE TYPE PartTimeStudent_typ UNDER Student_typ ( numhours NUMBER);

214 Esempio (su attributi) CREATE TABLE Dipartimenti (Id INTEGER, nome VARCHAR(20), manager Person_typ); INSERT INTO dipartimenti VALUES (1,ricerca, Person_typ(1243, 'Bob', '121 Front St')); INSERT INTO dipartimenti VALUES (2,sviluppo,Student_typ(3456, 'Joe', '34 View', 12, 'HISTORY')); INSERT INTO dipartimenti VALUES (3, testing,PartTimeStudent_typ(5678, 'Tim', 13, 'PHYSICS', 20));

215 Esempio (su tuple) CREATE TABLE persons OF Person_typ; INSERT INTO persons VALUES (Person_typ(1243, 'Bob', '121 Front St')); INSERT INTO persons VALUES (Student_typ(3456, 'Joe', '34 View', 12, 'HISTORY')); INSERT INTO persons VALUES (PartTimeStudent_typ(5678, 'Tim', 13, 'PHYSICS', 20));

216 Limitare sostituibilità CREATE TABLE Dipartimenti (Id INTEGER, nome VARCHAR(20), manager Person_typ) COLUMN manager NOT SUBSTITUTABLE AT ALL LEVELS; Manager può solo essere una persona (sottotipi non ammessi) CREATE TABLE persons OF Person_typ NOT SUBSTITUTABLE AT ALL LEVELS; la tabella persons può contenere solo persone

217 Limitare sostituibilità CREATE TABLE Dipartimenti (Id INTEGER, nome VARCHAR(20), manager Person_typ) COLUMN manager IS OF (ONLY Student_typ); Si può specificare solo un sottotipo

218 Interrogazioni Funzioni utili: – REF – DEREF – VALUE – IS OF TYPE –... REF, DEREF, VALUE già viste

219 Esempio Si consideri la tabella Dipartimenti presentata in precedenza (senza limitazioni di sostituibilità) SELECT * FROM Dipartimenti p WHERE p.manager IS OF (Student_typ,PartTimeStudent_typ) restituisce i dipartimenti i cui manager sono studenti o studenti part-time

220 Esempio Si consideri la tabella Persons presentata in precedenza (senza limitazioni di sostituibilità) SELECT * FROM Persons p WHERE VALUE(p) IS OF (Student_typ,PartTimeStudent_typ) restituisce le persone che sono studenti o studenti part- time

221 Differenze principali con SQL-99 Tipi collezione – SQL-99: solo ARRAY – Oracle: VARRAY e NESTED TABLE Ereditarietà – SQL-99: su tipi e tabelle, no sostituibilità – Oracle: solo su tipi sostituibilità

222 Utilizzo di funzionalità OR da JDBC Consideriamo JDBC 3 (ma molte estensioni già presenti in JDBC 2) Nuove interfacce per implementare mapping di tipi object relational in tipi Java

223 Creazione nuovi tipi Essendo un comando DDL, si utilizza il metodo executeUpdate String type = CREATE TYPE t_indirizzo AS numero_civicoINTEGER, viaVARCHAR(50), cittàCHAR(20), statoCHAR(2), capINTEGER; Statement st = con.createStatement( ); st.executeUpdate(type);

224 Manipolazione valori nuovi tipi da Java Nuove interfacce (solo per tipi standard): – STRUCT per mappare ADT – REF per mappare valori di tipo riferimento – ARRAY per mappare valori di tipo array – SQLDATA per semplificare mapping di ADT

225 Manipolazione valori nuovi tipi da Java Per ogni interfaccia, il driver prescelto specificherà una classe che implementa linterfaccia questo permette di gestire le eventuali differenze esistenti tra DBMS

226 Tipi semplici Nessuna nuova interfaccia si manipolano utilizzando i metodi del tipo di base Esempio – CREATE TYPE id_impiegato AS INTEGER FINAL; – Si usano i metodi getInt e setInt per leggere e scrivere campi di tipo id_impiegato

227 ADT Le istanze di tipi ADT vengono mappate in istanze di classe Struct un oggetto di tipo Struct contiene un valore per ogni attributo dellADT a cui si riferisce i metodi per poter leggere e scrivere valori di attributi con tipo ADT sono – ResultSet - getObject(int): per accedere attributi di tipo ADT – Struct - getAttributes(): per accedere le componenti di unistanza – PreparedStatement - setObject(int, Struct): per settare parametri di tipo ADT

228 Esempio CREATE TABLE Impiegati ( imp# INTEGER PRIMARY KEY, nome CHAR(20), indirizzo t_indirizzo); vogliamo attribuire lindirizzo dellimpiegato 12 a Verdi

229 Esempio (continua) String query = select indirizzo from Impiegati where imp# = 12; Statement st = con.createStatement(); ResultSet rs = st.executeQuery(query); rs.next(); Struct indirizzo = (Struct) rs.getObject(1); //si ottiene listanza Object[ ] ind_attr = indirizzo.getAttributes(); //si accedono gli attributi System.out.print( Via + ind_attr[1] + + ind_attr[0] + + ind_attr[2] + + ind_attr[4] + + ind_attr[3]);

230 Esempio (continua) String up = update Impiegati set indirizzo = ? where nome =Verdi; PreparedStatement pst = con.prepareStatement(up); pst.setObject(1, indirizzo); pst.executeUpdate( );

231 Tipi riferimento Le istanze di tipi riferimento (puntatori) vengono mappate in istanze di classe Ref i metodi per poter leggere e scrivere valori di attributi con tipo riferimento sono – ResultSet - getRef(int): per accedere attributi di tipo riferimento – Ref - getObject( ): dato un valore di tipo riferimento, restituisce loggetto puntato (solo JDBC 3) – Ref - setObject(Struct): il parametro diventa il nuovo oggetto puntato (solo JDBC 3) – PreparedStatement - setRef(int, Ref): per settare parametri di tipo riferimento

232 Esempio CREATE TYPE t_progetto AS prj#INTEGER, nomeVARCHAR(20), descrizioneVARCHAR(50), budgetINTEGER; CREATE TABLE Progetti of t_progetto; CREATE TABLE Impiegati( imp#INTEGER PRIMARY KEY, nomeVARCHAR(50), indirizzot_indirizzo, assegnamentoREF(t_progetto));

233 Esempio (continua) Si vuole associare il progetto dellimpiegato 12 a Verdi e visualizzare le informazioni su tale progetto

234 Esempio (continua) String query = select assegnamento from Impiegati where imp# = 12; Statement st = con.createStatement(query); ResultSet rs = st.executeQuery(); rs.next(); Ref assegn_ref = rs.getRef(1); //si ottiene lidentificatore String update = update impiegati set assegnamento = ? where nome = Verdi; PreparedStatement pst = con.prepareStatement(update); pst.setRef(1,assegn_ref); pst.executeUpdate( );

235 Esempio (continua) Struct progetto = (Struct) assegn_ref.getObject( ); Object [ ] prog_attr = progetto. getAttributes(); System.out.print(ind_attr[0] + + ind_attr[1] + + ind_attr[2] ind_attr[3]);

236 Tipi array Le istanze di tipi array vengono mappate in istanze di classe Array rappresentano puntatori alla base di dati (il contenuto non viene copiato) i metodi per poter leggere e scrivere valori di attributi di tipo array sono – ResultSet - getArray(): per accedere attributi di tipo array (restituisce un puntatore allistanza) – Array - getArray( ): permette di copiare i dati contenuti nellarray in strutture locali al programma – Array - getResultSet (): restituisce un result set che contiene una tupla per ogni elemento dellarray, con due colonne. La prima contiene lindice (partendo da 1), la seconda il valore – PreparedStatement - setArray(int,Array): per settare parametri di tipo Array

237 Esempio CREATE TABLE Impiegati( imp#INTEGER PRIMARY KEY, nomeVARCHAR(50), indirizzot_indirizzo, competenzeVARCHAR(20) ARRAY[10]); si vogliono stampare tutte le competenze dellimpiegato 12

238 Esempio (continua) String query = select competenze from Impiegati where imp# = 12; Statement st = con.createStatement(query); ResultSet rs = st.executeQuery(); rs.next(); Array comp = rs.getArray(1); //restituisce un puntatore allarray String [ ] comp_arr = (String [ ]) comp.getArray( ); for (int i = 0; i < comp_arr.length(); i++) System.out.print(comp_arr[i])

239 Tipi collezione Come abbiamo visto i sistemi non sono conformi allo standard per quanto riguarda i tipi collezione il driver potrà eventualmente utilizzare la classe Array anche per gestire altri tipi collezione – in JDBC le nested table di Oracle si mappano in oggetti di tipo Array

240 SQL Data Interfaccia ogni classe che implementa SQLData permette di definire un mapping esplicito tra un tipo SQL e una classe Java – casting definito esplicitamente dallutente semplifica laccesso agli oggetti strutturati – la lettura di un oggetto restituisce unistanza della classe associata dal mapping – non si devono piu utilizzare Struct e Object non lo vediamo