Basi di Dati Relazionali - Corsi di Laurea a Distanza

Transcript

Basi di Dati Relazionali - Corsi di Laurea a Distanza
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 1
Prev
Home
Next
Basi
Basi di
di Dati
Dati
Relazionali
Relazionali
-Parte
Parte IIII
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 2
Basi di Dati
Prev
Home
Next
Basi di dati relazionali
•
•
•
•
Esempi di interrogazioni
Le viste
Il catalogo di sistema
Embedded SQL
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 3
Prev
Home
Next
DB Parti Fornitori Progetti
E` data la seguente base di dati:
• fornitori:
S (S#, SNAME, STATUS, CITY)
• prodotti:
P (P#, PNAME, COLOR, WEIGHT, CITY)
• progetti:
J (J#, JNAME, CITY)
• forniture:
SPJ (S#, P#, J#, QTY)
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 4
Basi di Dati
Prev
Home
Next
DB Prodotti Fornitori Progetti
S
P
S#
SNAME
STATUS
CITY
S1
S2
S3
S4
S5
Smith
Jones
Blake
Clark
Adams
20
10
30
20
30
London
Paris
Paris
London
Athens
P#
PNAME COLOR WEIGHT
P1
P2
P3
P4
P5
P6
Nut
Bolt
Screw
Screw
Cam
Cog
© Politecnico di Torino
Red
Green
Blue
Red
Blue
Red
12
17
17
14
12
19
J
CITY
J#
JNAME
CITY
J1
J2
J3
J4
J5
J6
J7
Sorter
Punch
Reader
Console
Collator
Terminal
Tape
Paris
Rome
Athens
Athens
London
Oslo
London
London
Paris
Rome
London
Paris
London
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 5
Basi di Dati
Prev
SPJ
DB Prodotti
Fornitori Progetti
© Politecnico di Torino
Autore: Scarsi Riccardo
Home
Next
S#
P#
J#
QTY
S1
S1
S2
S2
S2
S2
S2
S2
S2
S2
S3
S3
S4
S4
S5
S5
S5
S5
S5
S5
S5
S5
S5
S5
P1
P1
P3
P3
P3
P3
P3
P3
P3
P5
P3
P4
P6
P6
P2
P2
P5
P5
P6
P1
P3
P4
P5
P6
J1
J4
J1
J2
J3
J4
J5
J6
J7
J2
J1
J2
J3
J7
J2
J4
J5
J7
J2
J4
J4
J4
J4
J4
200
700
400
200
200
500
600
400
800
100
200
500
300
300
200
100
500
100
200
100
200
800
400
500
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 6
Prev
Home
Next
Esercizi
Trovare tutte le informazioni relative a tutti i
progetti.
SELECT * FROM J;
Trovare tutte le informazioni relative ai progetti
di Londra.
SELECT * FROM J
WHERE J.CITY = 'London';
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 7
Prev
Home
Next
Esercizi
Trovare i codici dei fornitori che forniscono il
progetto J1 ordinati in ordine crescente di
codice fornitore.
SELECT DISTINCT S#
FROM SPJ
WHERE J# = 'J1'
ORDER BY S#;
Ricavare l'elenco di tutte le combinazioni
colore/città dalla tabella prodotti, eliminando le
repliche.
SELECT DISTINCT COLOR, CITY
FROM P;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 8
Prev
Home
Next
Esercizio
Trovare le forniture per cui la quantità indicata è
compresa nell'intervallo 300 - 750, estremi
inclusi.
SELECT S#, P#, J#, QTY
FROM SPJ
WHERE QTY >= 300
AND QTY <= 750;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 9
Prev
Home
Next
Esercizio
Trovare le combinazioni codice fornitore,
codice prodotto, codice progetto tali che tutti e
tre i codici appartengano ad elementi collocati
nella stessa città.
SELECT S#, P#, J#
FROM S, P, J
WHERE S.CITY = P.CITY
AND P.CITY = J.CITY;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 10
Prev
Home
Next
Esercizio
Trovare i codici dei prodotti, dei fornitori e dei
progetti che non appartengono tutti alla stessa
città.
SELECT S#, P#, J#
FROM S, P, J
WHERE NOT
(S.CITY = P.CITY AND
P.CITY = J.CITY);
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 11
Prev
Home
Next
Esercizio
Trovare i codici dei prodotti forniti da fornitori
di Londra.
SELECT DISTINCT P#
FROM SPJ, S
WHERE S.S# = SPJ.S#
AND CITY = 'London';
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 12
Prev
Home
Next
Esercizio
Trovare le terne codice fornitore, codice
prodotto, codice progetto tali che appartengano
ad elementi collocati in città tutte diverse tra
loro.
SELECT S#, P#, J#
FROM S, P, J
WHERE S.CITY <> P.CITY
AND P.CITY <> J.CITY
AND J.CITY <> S.CITY;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 13
Prev
Home
Next
Esercizio
Ricavare i codici dei progetti forniti da almeno
un fornitore collocato in una città diversa
rispetto a quella del progetto.
SELECT DISTINCT J.J#
FROM J, S, SPJ
WHERE SPJ.S# = S.S#
AND SPJ.J# = J.J#
AND S.CITY <> J.CITY;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 14
Prev
Home
Next
DB Parti Fornitori Progetti
Trovare le coppie di codici di prodotti tali che
entrambi i prodotti presenti nella coppia siano
forniti dallo stesso fornitore.
SELECT DISTINCT SPJX.P#, SPJY.P#
FROM SPJ SPJX, SPJ SPJY
WHERE SPJX.S# = SPJY.S#
AND SPJX.P# > SPJY.P#;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 15
Prev
Home
Next
Esercizio
Trovare i codici dei prodotti forniti da un
fornitore di Londra ad un progetto di Londra.
SELECT DISTINCT P#
FROM S, J, SPJ
WHERE S.S# = SPJ.S#
AND J.J# = SPJ.J#
AND J.CITY = 'London'
AND J.CITY = S.CITY;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 16
Basi di Dati
Prev
Home
Next
Esercizio
Trovare le coppie di città tali che un fornitore
nella prima fornisca un progetto nella seconda.
SELECT DISTINCT S.CITY, J.CITY
FROM S, J, SPJ
WHERE S.S# = SPJ.S#
AND SPJ.J# = J.J#;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 17
Prev
Home
Next
Esercizio
Trovare i codici dei prodotti forniti a qualsiasi
progetto da un fornitore nella stessa città di
quel progetto.
SELECT DISTINCT P#
FROM S, J, SPJ
WHERE S.S# = SPJ.S#
AND J.J# = SPJ.J#
AND S.CITY = J.CITY;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 18
Prev
Home
Next
Esercizio
Trovare il numero totale di progetti forniti da S1.
SELECT COUNT (DISTINCT J#)
FROM SPJ
WHERE S# = 'S1';
Trovare la quantità totale di prodotti P1 forniti
dal fornitore S1.
SELECT SUM(QTY)
FROM SPJ
WHERE P# ='P1' AND S# = 'S1';
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 19
Prev
Home
Next
Esercizio
Per ogni prodotto fornito ad un progetto,
trovare il codice del prodotto, il codice del
progetto
e
la
corrispondente
quantità
complessiva fornita.
SELECT P#, J#, SUM(QTY)
FROM SPJ
GROUP BY P#, J#;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 20
Prev
Home
Next
Esercizio
Trovare i codici dei prodotti forniti in quantità
media superiore a 320.
SELECT P#
FROM SPJ
GROUP BY P#
HAVING AVG(QTY) > 320;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 21
Prev
Home
Next
Esercizio
Trovare le forniture per cui la quantità è diversa
da NULL.
SELECT S#, P#, J#, QTY
FROM SPJ
WHERE QTY IS NOT NULL;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 22
Prev
Home
Next
Esercizi
Trovare i nomi dei progetti forniti dal fornitore S1.
SELECT DISTINCT JNAME FROM J
WHERE J# IN
(SELECT J# FROM SPJ
WHERE S# = 'S1');
Trovare i codici dei progetti le cui città sono
caratterizzate da una O come seconda lettera.
SELECT J#, CITY FROM J
WHERE CITY LIKE '_O%';
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 23
Basi di Dati
Prev
Home
Next
Esercizio
Trovare i colori dei prodotti forniti dal fornitore
S1.
SELECT DISTINCT COLOR FROM P
WHERE P# IN
(SELECT P# FROM SPJ
WHERE S# = 'S1');
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 24
Basi di Dati
Prev
Home
Next
Esercizio
Trovare i codici dei prodotti forniti a progetti di
Londra.
SELECT DISTINCT P# FROM SPJ
WHERE J# IN
(SELECT J# FROM J
WHERE CITY = 'London');
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 25
Basi di Dati
Prev
Home
Next
Esercizio
Trovare i codici dei progetti che usano almeno
un prodotto disponibile presso il fornitore S1.
SELECT DISTINCT J# FROM SPJ
WHERE P# IN
(SELECT P# FROM SPJ
WHERE S# = 'S1');
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 26
Basi di Dati
Prev
Home
Next
Esercizio
Trovare i codici dei progetti la cui città è prima
nell'elenco in ordine alfabetico delle città.
SELECT J# FROM J
WHERE CITY =
(SELECT MIN(CITY) FROM J);
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 27
Basi di Dati
Prev
Home
Next
Esercizio
Trovare i codici dei progetti forniti con prodotti
P1 in quantità media maggiore della massima
quantità con cui viene rifornito il progetto J1.
SELECT J# FROM SPJ
WHERE P# = 'P1'
GROUP BY J#
HAVING AVG(QTY) >
(SELECT MAX(QTY) FROM SPJ
WHERE J# = 'J1');
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 28
Prev
Home
Next
Esercizio
Trovare i codici dei fornitori con stato inferiore
a quello del fornitore S1.
SELECT S# FROM S
WHERE STATUS <
(SELECT STATUS FROM S
WHERE S# = 'S1');
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 29
Prev
Home
Next
Esercizio
Trovare i codici dei fornitori che forniscono
almeno un prodotto fornito da almeno un
fornitore che fornisce almeno un prodotto
rosso.
SELECT DISTINCT S# FROM SPJ
WHERE P# IN
(SELECT P# FROM SPJ
WHERE S# IN
(SELECT S# FROM SPJ
WHERE P# IN
(SELECT P# FROM P
WHERE COLOR = 'Red')));
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 30
Prev
Home
Next
Esercizio
Trovare i codici dei fornitori che forniscono
almeno un progetto con prodotti P1 in quantità
maggiore della quantità media delle forniture di
prodotti P1 per quel progetto.
SELECT DISTINCT S#
FROM SPJ SPJX
WHERE P# = 'P1'
AND QTY >
(SELECT AVG(QTY)
FROM SPJ SPJY
WHERE P# ='P1'
AND SPJY.J# = SPJX.J#);
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 31
Prev
Home
Next
Esercizio
Modificare il colore di tutti i prodotti rossi in
giallo.
UPDATE P
SET COLOR = 'Yellow '
WHERE COLOR = 'Red';
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 32
Prev
Home
Next
Esercizio
Cancellare tutti i progetti per cui non esistono
forniture.
DELETE FROM J
WHERE J# NOT IN
(SELECT J# FROM SPJ);
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 33
Prev
Home
Next
Esercizio
Cancellare tutti i progetti di Roma e tutte le
forniture ad essi relative.
DELETE FROM SPJ
WHERE J# IN (SELECT J#
FROM J
WHERE CITY = 'Rome');
DELETE FROM J
WHERE CITY = 'Rome';
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 34
Prev
Home
Next
Esercizio
Inserire un nuovo fornitore nella tabella S (S10).
Il nome della città è New York, il nome del
fornitore è White, lo stato è ignoto.
INSERT INTO S (S#, SNAME, CITY)
VALUES('S10','White','New York');
oppure
INSERT INTO S(S#, SNAME, STATUS, CITY)
VALUES('S10','White',NULL,'New York');
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 35
Prev
Home
Next
DB Parti Fornitori Progetti
Costruire una tabella contenente un elenco di
codici di prodotti forniti da un fornitore di
Londra oppure relativi ad un progetto di
Londra.
CREATE TABLE LP (P# CHAR(6));
INSERT INTO LP (P#)
SELECT DISTINCT P# FROM SPJ
WHERE S# IN
(SELECT S# FROM S
WHERE CITY='London')
OR J# IN
(SELECT J# FROM J
WHERE CITY='London');
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 36
Prev
Home
Next
Viste
La vista (view) è una tabella virtuale: non esiste
realmente anche se l'utente la percepisce sotto
forma di tabella.
Una tabella di base (al contrario di una view) ha
un riscontro fisico: ad ogni elemento della
tabella corrisponde un elemento sul supporto
magnetico.
La definizione di una view è basata su tabelle di
base e viene memorizzata nel catalogo.
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 37
Prev
Home
Next
Esempio
Definire una vista contenente il codice, la città e
lo stato di tutti i fornitori con stato maggiore di
15.
CREATE VIEW GOOD_SUPPLIERS AS
SELECT S#, STATUS, CITY
FROM S
WHERE STATUS > 15;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 38
Prev
Home
Next
Esempio
In questo caso, l'interrogazione
SELECT .. FROM .. WHERE ...
che segue AS non viene eseguita, ma
semplicemente salvata nel catalogo.
Gli utenti possono operare sulla vista come se
fosse una tabella:
SELECT *
FROM GOOD_SUPPLIERS
WHERE CITY <> 'London';
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 39
Prev
Home
Next
Esempio
L'interrogazione
è
concatenata
con
la
definizione della vista residente nel catalogo:
SELECT S#, STATUS, CITY
FROM S
WHERE STATUS > 15
AND CITY <> 'London';
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 40
Prev
Home
Next
Definizione di una vista
CREATE VIEW
nome-vista [(nome-colonna [, nome-colonna, ..])]
AS subquery
[WITH [LOCAL | CASCADED] CHECK OPTION];
La definizione mette in relazione lo schema esterno
(vista) con l'oggetto definito a livello concettuale
(subquery).
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 41
Prev
Home
Next
Definizione di una vista
Se i nomi delle colonne della vista non sono
specificati, sono utilizzati quelli specificati nella
select.
I nomi delle colonne devono essere specificati
se:
– rappresentano il risultato di una funzione
interna
– rappresentano il risultato di un' espressione
o sono costanti
– due colonne hanno lo stesso nome
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 42
Prev
Home
Next
Esempio
Definire una vista contente codice prodotto,
nome, peso e città di tutti i prodotti di colore
rosso.
CREATE VIEW
REDPARTS (P#, PNAME, WT, CITY)
AS SELECT P#, PNAME, WEIGHT, CITY
FROM P
WHERE COLOR = 'Red';
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 43
Basi di Dati
Prev
Home
Next
Esempio
Definire una vista contenente il codice prodotto
(di ogni prodotto fornito) e la somma di tutte le
corrispondenti quantità fornite.
CREATE VIEW PQ (P#, TOTQTY)
AS SELECT P#, SUM(QTY)
FROM SP
GROUP BY P#;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 44
Prev
Home
Next
Esempio
Definire una vista contenente tutte le coppie di
città x,y tali che un fornitore localizzato nella
città x fornisca un prodotto immagazzinato
nella città y.
CREATE VIEW CITY_PAIRS (SCITY, PCITY)
AS SELECT DISTINCT S.CITY, P.CITY
FROM S, SP, P
WHERE S.S# = SP.S#
AND SP.P# = P.P#;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 45
Basi di Dati
Prev
Home
Next
Esempio
Definire una vista contenete codice prodotto e
peso di tutti i prodotti rossi immagazzinati a
Londra.
CREATE VIEW LONDON_REDPARTS
AS SELECT P#, WT
FROM REDPARTS
WHERE CITY = 'London';
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 46
Basi di Dati
Prev
Home
Next
Cancellazione di viste
Per cancellare una vista:
DROP VIEW nome-vista;
La cancellazione di una tabella (di base)
comporta l'eliminazione automatica delle viste
che ad essa si riferiscono.
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 47
Prev
Home
Next
Aggiornamento dei dati
• E` possibile eseguire operazioni di aggiornamento dei dati contenuti in una vista solo per
alcune tipologie di viste.
• Standard SQL-92: sono aggiornabili le viste
in cui una sola riga di ciascuna tabella di
base corrisponde a una sola riga della vista.
• I prodotti relazionali non presentano un
comportamento standard.
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 48
Prev
Home
Next
Aggiornamento dei dati
• Non sono aggiornabili:
– viste che non contengono la chiave
primaria della tabella di base
– viste contenenti join che rappresentano
corrispondenze uno a molti o molti a molti
– viste contenenti funzioni aggregate
– viste contenenti DISTINCT
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 49
Prev
Home
Next
Esempio
CREATE VIEW GOOD_SUPPLIERS
AS SELECT S#, STATUS, CITY
FROM S
WHERE STATUS > 15;
+
UPDATE GOOD_SUPPLIERS
SET STATUS = STATUS + 10
WHERE CITY = 'Paris';
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 50
Prev
Home
Next
Esempio
CREATE VIEW S#_CITY
AS SELECT S#, CITY
FROM S;
• inserimento di (S6,Rome) in S#_CITY
⇒ inserimento di (S6,NULL,NULL,Rome) in S
• cancellazione di (S1,London) da S#_CITY
⇒ cancellazione di (S1,Smith,20,London) da S
• modifica di (S1,London) in (S1,Rome) in S#_CITY
⇒ modifica che porta a (S1,Smith,20,Rome) in S
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 51
Prev
Home
Next
Esempio
CREATE VIEW STATUS_CITY
AS SELECT STATUS, CITY
FROM S;
• inserimento di (40,Rome) in STATUS_CITY
⇒ impossibile inserire (NULL,NULL,40,Rome) in S
• cancellazione di (20,London) da STATUS_CITY
⇒ quale record cancellare da S?
• modifica di (20,London) in (20,Rome) in
STATUS_CITY
⇒ quale record modificare in S?
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 52
Prev
Home
Next
Esempio
CREATE VIEW BIG_SUPPLIERS(S#,SNAMEP#,QTY)
AS SELECT S#,SNAME,P#,QTY
FROM S,SP
WHERE S.S#=SP.S#
AND QTY>100;
La vista non è aggiornabile
⇒corrispondenza uno a molti tra fornitore e sue
forniture
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 53
Prev
Home
Next
Esempio
CREATE VIEW BIG_SUPPLIERS2(S#,SNAME)
AS SELECT S#,SNAME
FROM S
WHERE S# IN
(SELECT S# FROM SP
WHERE QTY > 100);
La vista è aggiornabile
⇒una riga nella vista corrisponde a una sola riga
nella tabella S
⇒il contenuto informativo è diverso da
SUPPLIERS (mancano P# e QTY)
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 54
Basi di Dati
Prev
Home
Next
Esempio
CREATE VIEW BIG_SUPPLIERS3 (S#,SNAMETOTQTY)
AS SELECT S#,SNAME,SUM(QTY)
FROM S,SP
WHERE S.S#=SP.S#
GROUP BY S#
HAVING SUM(QTY) > 100;
La vista non è aggiornabile
⇒contiene una funzione aggregata
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 55
Prev
Home
Next
Esempio
CREATE VIEW BIG_SUPPLIERS4(S#,SNAME)
AS SELECT S#,SNAME FROM S
WHERE S.S# IN
(SELECT S# FROM SP
GROUP BY S#
HAVING SUM(QTY)>100);
La vista è aggiornabile
⇒una riga nella vista corrisponde a una sola riga
nella tabella S
⇒il contenuto informativo è diverso da
SUPPLIERS3
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 56
Prev
Home
Next
Check option
• Si possono aggiornare solo righe appartenenti
alla vista.
• Dopo l’aggiornamento le righe devono ancora
appartenere alla vista.
• Se una vista è definita in termini di altre viste:
• l’opzione LOCAL verifica la correttezza
dell’aggiornamento
solo
sulla
vista
aggiornata
• l’opzione CASCADED (default) esegue la
verifica su tutte le viste coinvolte
nell’aggiornamento.
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 57
Prev
Home
Next
Esempio
CREATE VIEW HEAVY_REDPARTS (P#, PNAME, WT)
AS SELECT P#, PNAME, WT
FROM RED_PARTS
WHERE WT > =10
WITH CHECK OPTION;
⇒ non si può aggiornare il peso con valori < 10
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 58
Basi di Dati
Prev
Home
Next
Esempio
CREATE VIEW LIGHTER_REDPARTS(P#,WT)
AS SELECT P#, WT
FROM HEAVY_REDPARTS
WHERE WT<20
WITH CHECK OPTION;
⇒se clausola CASCADED (default)
– peso aggiornabile solo con valori tra 10 e 20
⇒se clausola LOCAL
– peso aggiornabile con valori < 20
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 59
Basi di Dati
Prev
Home
Next
Catalogo di sistema
Contiene i descrittori di alcuni elementi rilevanti
per il sistema:
– tabelle
– viste
– indici
– utenti
– privilegi di accesso
– piani delle applicazioni
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 60
Basi di Dati
Prev
Home
Next
Catalogo di sistema
• Il catalogo è strutturato in tabelle come i
dati.
• L'ottimizzatore usa il catalogo per decidere
le strategie di accesso.
• Il catalogo di prodotti diversi può essere
strutturato in modo diverso (es. il catalogo di
DB2 è diverso dal catalogo di INGRES).
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 61
Prev
Home
Next
Tabelle fondamentali del catalogo
• SYSTABLES:
SYSTABLES una riga per ogni relazione o
vista. Contiene il nome della tabella (NAME), il
nome dell'utente (CREATOR), il numero di
colonne (COLCOUNT) ed altre informazioni.
• SYSCOLUMNS:
SYSCOLUMNS una riga per ogni colonna di
ogni tabella. Contiene il nome della colonna
(NAME), il nome della tabella (TAB-NAME), il
tipo di dato (COLTYPE) ed altre informazioni.
• SYSINDEX:
SYSINDEX una riga per ogni indice. Contiene
il nome dell'indice (NAME), il nome della
tabella indicizzata (TBNAME), il nome
dell'utente (CREATOR) ed altre informazioni.
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 62
Prev
SYSTABLES
NAME
CREATOR COLCOUNT
SYSCOLUMNS
NAME
TABNAME
COLTYPE
NAME
TBNAME
CREATOR
SYSINDEX
© Politecnico di Torino
Autore: Scarsi Riccardo
Home
Next
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 63
Basi di Dati
Prev
Home
Next
Interrogazione del catalogo
E` possibile interrogare il catalogo con
istruzioni SQL.
Esempio: trovare quali tabelle contengono una
colonna S#.
SELECT TBNAME
FROM SYSCOLUMNS
WHERE NAME = 'S#';
Risultato :
TBNAME
S
SP
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 64
Prev
Home
Next
Interrogazione del catalogo
• Quali colonne ha la tabella S?
SELECT NAME
FROM SYSCOLUMNS
WHERE TBNAME = 'S';
• Quante tabelle ha creato l'utente Rossi?
SELECT COUNT(*)
FROM SYSTABLES
WHERE CREATOR = 'Rossi';
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 65
Prev
Home
Next
Aggiornamento del catalogo
Il catalogo non può essere aggiornato dagli
utenti (esempio: l'eliminazione di una colonna
impedirebbe di accedere ai dati in essa
contenuti).
L'aggiornamento del catalogo avviene con l'uso
delle istruzioni:
– CREATE TABLE, INDEX, VIEW
– ALTER TABLE
– DROP TABLE, INDEX, VIEW
in modo indiretto.
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 66
Prev
Home
Next
Embedded SQL
• Istruzioni espresse in linguaggio SQL
possono essere introdotte in un linguaggio di
programmazione (ospite) di terza generazione
(Cobol, C, Fortran, PL/I, ...)
• Sono necessari costrutti per interfacciare i
linguaggi:
– SQL produce come risultato un set
– il linguaggio ospite opera su un record per
volta
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 67
Basi di Dati
Prev
Home
Next
Aspetti fondamentali
• prefisso EXEC SQL per ogni istruzione SQL
• dichiarazioni DECLARE TABLE, DECLARE
CURSOR
• introduzione di riferimenti a variabili del
linguaggio ospite:
– nelle query al posto delle costanti usate
con l'approccio interattivo
– come variabili di output introdotte da INTO
per SELECT e FETCH
– (:) le distingue dai campi di SQL
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 68
Basi di Dati
Prev
Home
Next
Esempio
char
int
char
.....
.....
GIVENS#[5];
RANK;
CITY[15];
ALPHA;
BETA;
EXEC SQL DECLARE S
(
TABLE
S#
SNAME
STATUS
CITY
CHAR(5)
CHAR(20),
SMALLINT,
CHAR(15) );
NOT NULL,
EXEC SQL INCLUDE SQLCA;
.................
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 69
Basi di Dati
Prev
Home
Next
Esempio
if (ALPHA > BETA)
{
EXEC SQL SELECT STATUS, CITY
INTO
:RANK,
:CITY
FROM
S
WHERE
S# = :GIVENS# ;
...................
printf (“%d %s\n”, RANK, CITY) ;
}
Frammento di un programma C con Embedded SQL
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 70
Prev
Home
Next
Osservazioni
• E` necessario dichiarare ogni tabella con
l'istruzione EXEC SQL DECLARE.
• Il tipo delle variabili host deve essere
compatibile con il tipo delle colonne SQL.
• Le variabili host e le colonne SQL possono
avere gli stessi identificatori.
• EXEC SQL INCLUDE SQLCA (communication
area): inclusione dell'area di comunicazione
tra SQL e linguaggio ospite.
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 71
Prev
Home
Next
Osservazioni
La query restituisce:
• il risultato nell'area SQLCA
• lo stato dell'operazione nella variabile
SQLCODE:
– SQLCODE=0: interrogazione terminata con
successo;
– SQLCODE>0: risultato anomalo (SQLCODE
= 100: nessun dato soddisfa l'interrogazione);
– SQLCODE < 0: errore di esecuzione (interrogazione non eseguita)
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 72
Prev
Home
Next
Cursori
Il linguaggio SQL opera su insiemi, i linguaggi
host agiscono su elementi singoli di un
insieme.
⇒ l'associazione tra i due ambienti è
ottenuta per mezzo di cursori, che
permettono di accedere ai record ottenuti
con un'operazione SQL uno per volta
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 73
Prev
Home
Next
SELECT di una sola riga
L'istruzione di SELECT restituisce una sola
riga.
Esempio: trovare stato e città per il fornitore il
cui valore del codice è contenuto nella variabile
(host) GIVENS#:
EXEC SQL
SELECT STATUS, CITY
INTO :RANK, :CITY
FROM S
WHERE S# = :GIVENS#;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 74
Prev
Home
Next
SELECT di una sola riga
Stato dell'operazione:
– SQLCODE = 0 al termine dell'esecuzione:
interrogazione eseguita correttamente. I
valori trovati vengono scritti nelle variabili
RANK e CITY.
– SQLCODE=100: nessun record soddisfa il
predi-cato.
– Se più record soddisfano il predicato:
SQLCODE=-xxxx; in questo caso le
variabili host non sono modificate.
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 75
Basi di Dati
Prev
Home
Next
UPDATE
Esempio: aumentare lo stato dei fornitori di
Londra della quantità contenuta nella variabile
RAISE.
EXEC SQL UPDATE S
SET STATUS = STATUS + :RAISE
WHERE CITY = 'London';
Se nessun record
SQLCODE=100.
© Politecnico di Torino
soddisfa
Autore: Scarsi Riccardo
il
predicato:
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 76
Prev
Home
Next
DELETE
Esempio: cancellare tutte le forniture dei
fornitori la cui città è individuata dalla variabile
CITY.
EXEC SQL
DELETE FROM SP
WHERE :CITY =
(SELECT CITY
FROM S
WHERE S.S# = SP.S#);
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 77
Prev
Home
Next
INSERT
Esempio: inserire un nuovo prodotto (codice
prodotto, nome, peso) i cui valori sono in PNO,
PNAME, PWT rispettivamente:
EXEC SQL
INSERT INTO P (P#, PNAME, WEIGHT)
VALUES (:PNO, :PNAME, :PWT);
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 78
Prev
Home
Next
Operazioni con il cursore
L'istruzione di SELECT restituisce un insieme di
righe.
– è necessario utilizzare un cursore per
accedere ad una riga per volta
– il cursore deve essere dichiarato con
l'istruzione DECLARE
– l'istruzione FETCH permette di leggere una
riga per volta dal risultato
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 79
Basi di Dati
Prev
Home
Next
Esempio
Ricavare le informazioni S#, SNAME, STATUS per i
fornitori situati nella città definita nella variabile Y.
EXEC SQL DECLARE X CURSOR FOR
SELECT S#, SNAME, STATUS
FROM S WHERE CITY = :Y
EXEC SQL OPEN X;
DO WHILE SQLCODE = 0
EXEC SQL
FETCH X INTO :S#, :SNAME, :STATUS
END;
EXEC SQL CLOSE X;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 80
Prev
Home
Next
Dichiarazione di un cursore
• DECLARE CURSOR definisce il cursore X,
associandogli un'interrogazione, che sarà
eseguita successivamente.
EXEC SQL DECLARE nome-cursore CURSOR
FOR select-statement
[FOR UPDATE OF nome-colonna [, nomecolonna] ...];
L'interrogazione può far riferimento a variabili
host.
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 81
Basi di Dati
Prev
Home
Next
Istruzioni per i cursori
• OPEN X: attiva il cursore X ed esegue la
query associata ad esso. Inizialmente X punta
al primo record (X=1).
• FETCH X: fa avanzare il cursore X fino al
record successivo e assegna i valori alle
variabili introdotte da INTO (FETCH = FETCH
next).
FETCH X INTO var-ospite [, var-ospite ] ...]
• CLOSE X: disattiva il cursore X.
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 82
Prev
Home
Next
Istruzioni che fanno uso di cursori
La riga a cui punta il cursore X può essere
aggiornata o cancellata:
EXEC SQL UPDATE nome-tabella
SET nome-colonna = espressione
[, nome-colonna = espressione]
WHERE CURRENT OF nome-cursore;
EXEC SQL DELETE FROM nome-tabella
WHERE CURRENT OF nome-cursore;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 83
Prev
Home
Next
Istruzioni che fanno uso di cursori
• Le istruzioni UPDATE CURRENT e DELETE
CURRENT non sono consentite se l'istruzione
SELECT nella dichiarazione del cursore:
– utilizza UNION o ORDER BY
– definisce una vista non modificabile
• In caso di aggiornamento la dichiarazione del
cursore deve indicare l'opzione FOR UPDATE.
• Esempio:
EXEC SQL UPDATE S
SET STATUS = STATUS + :RAISE
WHERE CURRENT OF X;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 84
Basi di Dati
Prev
Home
Next
Esempio di Programma
Il programma:
• accetta quattro valori in ingresso:
– codice del prodotto (GIVENP#)
– nome della città (GIVENCITY)
– livello di stato (GIVENLVL)
– incremento di stato (GIVENINC)
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 85
Prev
Home
Next
Esempio di Programma
• esamina tutti i fornitori che forniscono il
prodotto GIVENP#:
– lo stato dei fornitori situati nella città
GIVENCITY è incrementato di una quantità
pari a GIVENINC
– altrimenti, se lo stato è minore di
GIVENLVL, il fornitore viene eliminato
insieme a tutte le sue forniture
• stampa le informazioni di ogni fornitore a cui
accede
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 86
Basi di Dati
void main ();
{
char
char
int
int
char
char
int
char
char
int
EXEC
© Politecnico di Torino
Prev
Home
Next
Programma (1/7)
GIVENP#[6];
GIVENCITY[20];
GIVENINC;
GIVENLVL;
S#[5];
SNAME[20];
STATUS;
CITY[20];
*DISP;
MORE_SUPPLIERS;
SQL INCLUDE
Autore: Scarsi Riccardo
SQLCA;
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 87
Basi di Dati
Prev
Home
Next
Programma (2/7)
EXEC
SQL DECLARE S
(
S#
SNAME
STATUS
CITY
TABLE
CHAR(5) NOT NULL,
CHAR(20),
SMALLINT,
CHAR(20) );
EXEC
SQL DECLARE SP
(
S#
P#
QTY
TABLE
CHAR(5) NOT NULL,
CHAR(6) NOT NULL,
INTEGER) ;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 88
Prev
Home
Next
Esempio di Programma (3/7)
EXEC
SQL DECLARE Z
CURSOR FOR
SELECT
FROM
WHERE
(
S#, SNAME, STATUS, CITY
S
EXISTS
SELECT *
FROM
SP
WHERE SP.S# = S.S#
AND SP.P# = :GIVENP#)
FOR UPDATE OF STATUS;
EXEC
EXEC
EXEC
© Politecnico di Torino
SQL WHENEVER NOT FOUND CONTINUE;
SQL WHENEVER SQLERROR CONTINUE;
SQL WHENEVER SQLWARNING CONTINUE;
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 89
Prev
Home
Next
Esempio di Programma (4/7)
/* begin main */
scanf (“%s %s %d %d\n”, GIVENP#, GIVENCITY, &GIVENINC, &GIVENLVL);
EXEC SQL OPEN Z;
if (SQLCODE!=0)
dberror();
MORE_SUPPLIERS = 1;
while (MORE_SUPPLIERS == 1)
{
EXEC SQL FETCH Z INTO :S#, :SNAME, :STATUS, :CITY;
switch (SQLCODE) {
case 100:
/* not found */
MORE_SUPPLIERS = 0;
break;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 90
Basi di Dati
Prev
Home
Next
Esempio di Programma (5/7)
case 0:
/* elaborazione fornitore */
DISP = ““;
if (strcmp(CITY ,GIVENCITY) == 0)
{
EXEC SQL UPDATE S
SET STATUS = STATUS + :GIVENINC
WHERE CURRENT OF Z;
if (SQLCODE != 0)
dberror();
DISP = “UPDATED”;
}
else
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 91
Prev
Home
Next
Esempio di Programma (6/7)
if (STATUS < GIVENLVL)
{
EXEC SQL DELETE FROM SP
WHERE S# = :S#;
if (SQLCODE!=0 && SQLCODE!=100)
dberror();
EXEC SQL DELETE FROM S
WHERE CURRENT OF Z;
if (SQLCODE != 0)
dberror();
DISP = “DELETED”;
}
/* end if su GIVENLVL e else prec.*/
printf (“%s %s %d %s %s\n”, S#, SNAME, STATUS, CITY,
DISP);
break;
/* end case 0 */
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 92
Prev
Home
Next
Esempio di Programma (7/7)
default:
dberror();
}
/* end switch */
}
/* end while */
EXEC SQL CLOSE Z;
EXEC SQL COMMIT;
}
/* end main() */
void dberror ()
{
print (SQLCA);
/* funzione che stampa la SQLCA */
EXEC SQL ROLLBACK;
exit(1);
}
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 93
Prev
Home
Next
Osservazioni
• L'istruzione DECLARE TABLE è estremamente simile a CREATE TABLE. Un programma
speciale (DCLGEN) provvede a generare la
dichiarazione della tabella e la dichiarazione
per definire nel linguaggio host un'area di
supporto per le operazioni di lettura e
scrittura.
• Ogni statement SQL deve essere seguito da
un test su SQLCODE.
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 94
Prev
Home
Next
Osservazioni
Direttiva (non eseguibile) per il precompilatore:
EXEC SQL WHENEVER condition action;
• condition:
– NOT FOUND: SQLCODE = 100
– SQLWARNING: SQLCODE > 0 e SQLCODE
<> 100
– SQLERROR: SQLCODE < 0
• action:
– CONTINUE
– GO TO LABEL
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 95
Prev
Home
Next
Osservazioni
• Il precompilatore inserisce
IF condition GO TO label
dopo ogni istruzione SQL che incontra.
• WHENEVER condition CONTINUE impone al
precompilatore di non inserire nulla.
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 96
Prev
Home
Next
Osservazioni
• In caso di anomalia il controllo passa ad una
procedura
che
stampa
informazioni
diagnostiche, esegue ROLLBACK e salta al
RETURN finale.
• Quando il programma aggiorna il DB,
l'operazione deve essere considerata come
tentativo di aggiornamento, poichè se
l'operazione non termina correttamente il DB
deve ritornare nello stato precedente.
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 97
Prev
Home
Next
Osservazioni
• Gli aggiornamenti restano sotto forma di
tentativo fino a:
– prima istruzione di COMMIT (terminazione
corretta)
– prima istruzione di ROLLBACK (anomalia)
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 98
Prev
Home
Next
Esercizio
Usando il DB fornitori - prodotti - progetti,
scrivere un programma in embedded SQL per
elencare tutti i record dei fornitori, ordinati per
codice fornitore. Ogni fornitore deve essere
seguito nell'elenco da tutti i record dei progetti
serviti da quel fornitore ordinati secondo il
codice del progetto.
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 99
Basi di Dati
Prev
Home
Next
Esercizio
EXEC SQL DECLARE CS CURSOR FOR
SELECT S#, SNAME, STATUS, CITY
FROM S
ORDER BY S#;
EXEC SQL DECLARE CJ CURSOR FOR
SELECT J#, JNAME, CITY
FROM J
WHERE J# IN
(SELECT J# FROM SPJ
WHERE S# = :CS_S#)
ORDER BY J#;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 100
Prev
Home
Next
Esercizio
EXEC SQL OPEN CS;
DO (per tutti i record di S accessibili con CS)
EXEC SQL FETCH CS
INTO :CS_S#, :CS_SN, :CS_ST, :CS_SC;
PRINT CS_S#, CS_SN, CS_ST, CS_SC;
EXEC SQL OPEN CJ;
DO (per tutti i record di J accessibili con CJ)
EXEC SQL FETCH CJ
INTO :CJ_J#, :CJ_JN, :CJ_JT,
:CJ_JC;
PRINT CJ_J#, CJ_JN, CJ_JC
END;
EXEC SQL CLOSE CJ;
END;
EXEC SQL CLOSE CS;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Basi di Dati
Pagina 101
Prev
Home
Next
Esercizio
Rivedere l'esercizio precedente (supponendo
che non sia richiesto l'ordinamento) aggiungendo le seguenti operazioni:
– cancellare ogni fornitore che non fornisce
alcun progetto
– incrementare lo stato del 50% per tutti i
fornitori che forniscono più di due progetti
diversi
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000
Politecnico di Torino
CeTeM
Pagina 102
Basi di Dati
Prev
Home
Next
Esercizio
• conteggio del numero di progetti:
EXEC SQL SELECT COUNT (DISTINCT J#)
INTO :NPROG FROM SPJ
WHERE S# = :CS_S#;
• se NPROG > 2:
EXEC SQL UPDATE S
SET STATUS = STATUS * 1.5
WHERE CURRENT OF CS;
• se NPROG = 0:
EXEC SQL DELETE FROM S
WHERE CURRENT OF CS;
© Politecnico di Torino
Autore: Scarsi Riccardo
Data ultima revisione 28/11/2000