SQL e linguaggi di programmazione
L’interazione con l’ambiente SQL può avvenire in 3 modi:
• in modo interattivo col server
• attraverso interfacce o linguaggi ad hoc legati a particolari DBMS
• attraverso i normali linguaggi di programmazione
In quest’ultimo caso è necessario che un preprocessore si occupi
di riconoscere in un sorgente il codice SQL e lo trasformi in codice
del linguaggio che si sta usando.
Uno dei problemi che sorgono è il fatto che SQL sia orientato agli
insiemi mentre i linguaggi di programmazione, ad eccezione di
alcuni linguaggi ad oggetti, possono essere soltanto orientati alle
tuple.
Le tuple dovranno quindi essere scandite una per una per eseguire
un comando SQL. Si può ovviare a questo o con linguaggi ad
oggetti che supportino operazioni evolute sugli insiemi o mediante i
cursori.
Cursori
I cursori estendono SQL in modo tale da fornire la possibilità ad un
programma di accedere alle tabelle una riga alla volta.
Hanno un comportamento simile ai puntatori a file.
declare NomeCursore [scroll] cursor for SelectSQL
[for < read only | update [ of Attributo { , Attributo } ] > ]
associa un cursore ad una interrogazione.
scroll indica se il programma può spostarsi liberamente
nell’interrogazione
for [read only | update] specifica se il cursore deve
essere usato in un comando di modifica o in sola lettura.
Cursori
open NomeCursore
attiva l’interrogazione cui è collegato il cursore e permette di
accedere al risultato tramite il comando
fetch [ Posizione from ] NomeCursore into ListadiFetch
che prende una riga dal cursore e la ripone nelle variabili della
ListadiFetch. La corrispondenza fra attributi e variabili è per
posizione. Quando si parla di riga corrente si intende l’ultima riga
letta.
Posizione può assumere i valori:
•next (il cursore legge la riga successiva alla corrente)
•prior (la precedente)
•first (la prima)
•last (l’ultima)
•absolute EsprIntera (la i-esima, i è il risultato dell’espressione)
•relative EsprIntera (la i-esima rispetto alla corrente)
Cursori
Le opzioni di posizione viste possono essere usate solo se è stata
specificata l’opzione scroll. Altrimenti solo next. In quel
caso l’implementazione è più efficiente.
update e delete possono usare i cursori.
update NomeTabella
set Attributo = < Espressione | null | default >
{, Attributo = < Espressione | null | default > }
where current of NomeCursore
delete from NomeTabella where current of NomeCursore
close NomeCursore chiude il cursore e libera la memoria dalla
copia del risultato della query cui è collegato.
Se la query restituisce solo una riga si può evitare il cursore e
usare select ListaAttributi into ListaVariabili
SQL dinamico
In molti casi è necessario formulare interrogazioni arbitrarie, non
solo parametrizzabili, ma anche dipendenti ad esempio dallo stato
dell’esecuzione di un programma.
Le interrogazioni che si possono formulare attraverso le istruzioni
viste sinora sono di tipo statico, cioè scritte una volta per tutte.
SQL dinamico consente di costruire interrogazioni al momento
dell’esecuzione di un programma.
In SQL statico, i comandi vengono compilati una volta per tutte.
Questo si traduce in elevata efficienza.
In SQL dinamico, per ottimizzare l’efficienza di un programma e
mantenerla equivalente a quella di SQL statico, sono previste due
modalità di esecuzione.
SQL dinamico
execute immediate IstruzioneSQL
Questo comando provoca l’esecuzione immediata dell’istruzione e
può quindi essere usato solo per comandi che non richiedono
parametri in ingresso o in uscita.
Es.
istruzioneSQL= “delete from Dipartimento
where Nome = ‘Amministrazione’ ”;
$ execute immediate :istruzioneSQL
Se il comando viene eseguito più volte o se il programma deve
gestire uno scambio di parametri bisogna distinguere 2 fasi:
preparazione ed esecuzione.
SQL dinamico
Fase di preparazione
prepare NomeComando from IstruzioneSQL
fa analizzare l’istruzione e la fa tradurre nel linguaggio procedurale
del sistema. Gli eventuali parametri sono sostituiti da ?
In pratica, definisce una funzione che sarà possibile chiamare dal
linguaggio ad alto livello.
prepare :comando
from
“select Città from Dipartimento where Nome = ? ”
Quando non serve più l’istruzione è possibile deallocare la
memoria
deallocate prepare NomeComando
deallocate prepare :comando
SQL dinamico
Fase di esecuzione
execute NomeComando
[ into TargetList ] [ using ListaParametri ]
La target list contiene le variabili in cui deve essere inserito il
risultato dell’esecuzione del comando. La lista dei parametri
specifica i valori che devono essere assunti dai parametri della
funzione.
execute :comando into :citta using :dipartimento
diventa, se :dipartimento assume il valore ‘Produzione’,
select Città from Dipartimento
where Nome = ‘Produzione’
SQL dinamico e cursori
I cursori vengono utilizzati come in SQL statico, con la sola
differenza
che
si
associa
al
cursore
l’identificativo
dell’interrogazione invece che l’interrogazione stessa e che si
possono usare using e into per specificare i valori dei parametri di
ingresso e uscita.
Es.
prepare :comando from :istruzioneSQL
declare Cursore cursor for :comando
open Cursore using :nome1
Progettazione di una base di dati
Ciclo di vita di un sistema informativo
• Studio di fattibilità definisce le varie alternative possibili, i
relativi costi e le priorità di realizzazione.
• Raccolta e analisi dei requisiti individua proprietà e funzionalità
del sistema tramite interazione con gli utenti e definizione informale
dei dati e delle operazioni.
• Progettazione divisa in progettazione dei dati e progettazione
delle applicazioni. Individua struttura e organizzazione dei dati e
caratteristiche degli applicativi che vi dovranno accedere.
• Implementazione realizza la base di dati e il codice dei
programmi conformemente alle specifiche
• Validazione e collaudo verifica il corretto funzionamento del
sistema informativo
• Funzionamento il sistema informativo diviene operativo
Metodologia di progettazione
Una metodologia di progettazione di una base di dati consiste in:
• decomposizione del progetto in più passi
• strategie realizzative e criteri di scelta di alternative
• modelli di riferimento per descrivere dati di ingresso e uscita
delle varie fasi
e può essere valutata in base alle proprietà:
• generalità: per garantire la possibilità di utilizzare la metodologia
indipendentemente dal problema affrontato
• qualità del prodotto (correttezza, completezza, efficienza)
• facilità d’uso di strategie e modelli di riferimento
Fasi della progettazione
• Progettazione concettuale
rappresenta le specifiche informali in modo formale e completo, ma
indipendente dalla rappresentazione usata nei DBMS. Produce lo
schema concettuale e fa riferimento ad un modello concettuale dei
dati. Rappresenta il contenuto informativo e non la codifica.
• Progettazione logica
traduce lo schema concettuale nello schema logico basato su un
modello logico (es. modello relazionale) ancora indipendente dalla
realizzazione fisica della base di dati.
• Progettazione fisica
completa lo schema logico con la specifica dei parametri fisici di
memorizzazione dei dati. Produce uno schema fisico e fa
riferimento ad un modello fisico dei dati, dipendente dal DBMS.
Modello dei dati
• insieme di costrutti utilizzati per organizzare i dati di interesse e
descriverne la dinamica
• componente
fondamentale:
meccanismi
di
strutturazione
(o
costruttori di tipo)
• come nei linguaggi di programmazione esistono meccanismi che
permettono di definire tipi di dati, così ogni modello dei dati prevede
alcuni costruttori
• ad esempio, il modello relazionale prevede il costruttore relazione,
che permette di definire insiemi di record omogenei
Due tipi (principali) di modelli
• modelli logici: utilizzati nei DBMS esistenti per l’organizzazione dei
dati
– utilizzati dai programmi
– indipendenti dalle strutture fisiche
esempi: relazionale, reticolare, gerarchico, a oggetti
• modelli concettuali: permettono di rappresentare i dati in modo
indipendente da ogni sistema e dal modello logico su cui è basato
– cercano di descrivere i concetti del mondo reale
– sono utilizzati nelle fasi preliminari di progettazione
il più noto è il modello Entità-Relazione
Modelli concettuali, perché?
• servono per ragionare sulla realtà di interesse,
indipendentemente dagli aspetti realizzativi
• permettono di rappresentare le classi di dati di
interesse e le loro correlazioni
• prevedono efficaci rappresentazioni grafiche (utili
anche per documentazione e comunicazione)
Progettazione
concettuale
Progettazione
logica
Progettazione
fisica
Scarica

Programma del Corso di Basi di Dati