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