Sei sulla pagina 1di 16

Basi di Dati- VIII

Corso di Laurea in Informatica Anno Accademico 2011/2012

Paolo Baldan baldan@math.unipd.it http://www.math.unipd.it/~baldan

8. SQL per le applicazioni

Thursday, May 24, 2012

Programma di massima

Corso di Basi di Dati

3

TransazioniMay 24, 2012 Programma di massima Corso di Basi di Dati 3 SQL per le applicazioni

SQL per le applicazioni PL/SQL PL/SQL

Basi di Dati 3 Transazioni SQL per le applicazioni PL/SQL Call level interface: ODBC e JDBC
Call level interface: ODBC e JDBC

Call level interface: ODBC e JDBC

Embedded SQL

Embedded SQL

Accesso da WEB HTML - cenni PHP - basics form, sessioni, autenticazione HTML - cenni PHP - basics form, sessioni, autenticazione

HTML - cenni PHP - basics form, sessioni, autenticazione 7. SQL per le applicazioni Thursday, May
HTML - cenni PHP - basics form, sessioni, autenticazione 7. SQL per le applicazioni Thursday, May
HTML - cenni PHP - basics form, sessioni, autenticazione 7. SQL per le applicazioni Thursday, May

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

Thursday, May 24, 2012

Thursday, May 24, 2012

SQL per le applicazioni

Transazioni

Transazioni

5 Transazioni: proprietà ACID

6

Un DBMS permette l’accesso “contemporaneo” di vari utenti e di vari processi (o thread) (o thread)

Necessità di impedire interazioni indesideratedi vari utenti e di vari processi (o thread) Concetto di transazione Transazione : sequenza di

Concetto di transazione(o thread) Necessità di impedire interazioni indesiderate Transazione : sequenza di istruzioni collegate che devono

Transazione: sequenza di istruzioni collegate che devono essere trattate come una unità indivisibile con proprietà di Atomicità: la transazione ha successo (committed) e produce un effetto visibile, oppure fallisce (aborted) e non ha alcun effetto sulla base di dati

( aborted ) e non ha alcun effetto sulla base di dati Consistenza : la transazione
Consistenza : la transazione porta la BD da uno stato consistente ad un altro sistema,

Consistenza: la transazione porta la BD da uno stato consistente ad un altro

sistema,

stato consistente (e.g., che soddisfa i vincoli di integrità) Isolamento : le transazioni non interferiscono

stato consistente (e.g., che soddisfa i vincoli di integrità) Isolamento: le transazioni non interferiscono tra di loro (sono serializzabili)

Durabilità : l’effetto di una transazione committed è permanente

Durabilità: l’effetto di una transazione committed è permanente

(indipendentemente da interazioni con altre transazioni, fallimenti di )

7. SQL per le applicazioni

Thursday, May 24, 2012

Transazioni

Corso di Basi di Dati

7

Le proprietà ACID non sono facili da ottenere in un ambiente multi-utente, multi-processore, distribuito.Thursday, May 24, 2012 Transazioni Corso di Basi di Dati 7 Esempio : Data la tabella

Esempio: Data la tabella Conti dei conti bancari : Data la tabella Conti dei conti bancari

Id Saldo 11 10000 13 15000 26 2000
Id
Saldo
11
10000
13
15000
26
2000

Un trasferimento SELECT Saldo INTO @saldo FROM Conti WHERE Id=11; UPDATE Saldo=0 WHERE Id=11; UPDATE Conti SET SELECT Saldo INTO @saldo FROM Conti WHERE Id=11; UPDATE Saldo=0 WHERE Id=11; UPDATE Conti SET Saldo=Saldo+@saldo WHERE Id=26;

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

7. SQL per le applicazioni

Thursday, May 24, 2012

Transazioni

Corso di Basi di Dati

8

Potrebbe non produrre il risultato desiderato se fallisce a metà o altre query modificano il DB contemporaneamente. se fallisce a metà o altre query modificano il DB contemporaneamente.

Es. Nel frattempo potrebbe essere fatto un prelievo sul conto con Id=11a metà o altre query modificano il DB contemporaneamente. Come si fa? 7. SQL per le

potrebbe essere fatto un prelievo sul conto con Id=11 Come si fa? 7. SQL per le
potrebbe essere fatto un prelievo sul conto con Id=11 Come si fa? 7. SQL per le

Come si fa?potrebbe essere fatto un prelievo sul conto con Id=11 7. SQL per le applicazioni Thursday, May

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

Come si fa?

9 Transazioni con LOCK

10

Meccanismi di lockingCome si fa? 9 Transazioni con LOCK 10 prima di leggere / modificare un dato una

prima di leggere / modificare un dato una transazione lo blocca (in lettura o lettura/scrittura)Come si fa? 9 Transazioni con LOCK 10 Meccanismi di locking - record - table se

- record

- table

se una transazione T2 tenta di acquisire un lock su di un dato già bloccato da T1, viene messa in attesa T1, viene messa in attesa

Comandisu di un dato già bloccato da T1, viene messa in attesa Sintassi LOCK TABLES tabelle

Sintassi LOCK TABLES tabelle { READ | WRITE } LOCK TABLES tabelle { READ | WRITE }

Il meccanismo di lock garantisce accesso esclusivo ad una tabella WRITE : solo il thread che acquisisce il lock può leggere o scrivere sulla tabella WRITE: solo il thread che acquisisce il lock può leggere o scrivere sulla tabella (gli altri non possono né leggere né scrivere) [eXclusive lock]

READ: il thread che acquisisce il lock, e così tutti gli altri, possono solo leggere : il thread che acquisisce il lock, e così tutti gli altri, possono solo leggere la tabella [Shared lock]

gli altri, possono solo leggere la tabella [ S hared lock] lock/unlock (su tabelle e/o blocchi

lock/unlock (su tabelle e/o blocchi di righe, gestito dall’utente) (su tabelle e/o blocchi di righe, gestito dall’utente)

start transaction/commit/rollback (ci si affida al dbms) (ci si affida al dbms)

7. SQL per le applicazioni

Thursday, May 24, 2012

Transazioni con LOCK

Corso di Basi di Dati

11

Esempio:May 24, 2012 Transazioni con LOCK Corso di Basi di Dati 11 LOCK TABLES Conti WRITE

LOCK TABLES Conti WRITE SELECT Saldo INTO @saldo FROM Conti WHERE Id=11; UPDATE Saldo=0 WHERE Id=11; UPDATE Conti SET Saldo=Saldo+@saldo WHERE Id=26; UNLOCK TABLES

Gestibile anche a livello di record SELECT * FROM SELECT * FROM SELECT * FROM SELECT * FROM

Lock espliciti utili per velocizzare applicazioni che usano meccanismi transazionali solo raramente. Altrimenti è meglio affidarsi al DBMSanche a livello di record SELECT * FROM SELECT * FROM LOCK IN SHARE MODE FOR

LOCK IN SHARE MODE

FOR UPDATE

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

7. SQL per le applicazioni

Thursday, May 24, 2012

Transazioni gestite dal DBMS

Corso di Basi di Dati

12

autocommit on stato di default ogni comando è una transazione impossibile fare rollback se si raggiunge uno stato di default ogni comando è una transazione impossibile fare rollback se si raggiunge uno stato indesiderato

autocommit off programmazione esplicita delle transazioni programmazione esplicita delle transazioni

autocommit off programmazione esplicita delle transazioni MySQL: SET autocommit = 0/1; 7. SQL per le applicazioni
autocommit off programmazione esplicita delle transazioni MySQL: SET autocommit = 0/1; 7. SQL per le applicazioni
autocommit off programmazione esplicita delle transazioni MySQL: SET autocommit = 0/1; 7. SQL per le applicazioni
autocommit off programmazione esplicita delle transazioni MySQL: SET autocommit = 0/1; 7. SQL per le applicazioni

autocommit off programmazione esplicita delle transazioni MySQL: SET autocommit = 0/1; 7. SQL per le applicazioni

MySQL:

SET autocommit = 0/1;

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

Transazioni gestite dal DBMS

13 Transazioni gestite dal DBMS

14

è possibile specificare (es. per MySQL InnoDB) che una sequenza di query forma una transazionegestite dal DBMS 13 Transazioni gestite dal DBMS 14 Una transazione inizia con START TRANSACTION START

Una transazione inizia con START TRANSACTION START TRANSACTION

transazione Una transazione inizia con START TRANSACTION START TRANSACTION ; SELECT Saldo INTO @saldo FROM

START TRANSACTION; SELECT Saldo INTO @saldo FROM Conti WHERE Id=11; UPDATE Saldo=0 WHERE Id=11; UPDATE Conti SET Saldo=Saldo+@saldo WHERE Id=26; COMMIT;

Gestisce il lock a livello di ennuple.Conti SET Saldo=Saldo+@saldo WHERE Id=26; COMMIT ; implicitamente con la prima istruzione su tabelle (SELECT,

implicitamente con la prima istruzione su tabelle (SELECT, UPDATE, INSERT) INSERT)

termina concon la prima istruzione su tabelle (SELECT, UPDATE, INSERT) COMMIT (successo esplicito) terminazione normale del

COMMIT (successo esplicito) (successo esplicito)

terminazione normale del programma (successo)UPDATE, INSERT) termina con COMMIT (successo esplicito) ROLLBACK (fallimento esplicito) terminazione con errore

ROLLBACK (fallimento esplicito) (fallimento esplicito)

terminazione con errore (fallimento)del programma (successo) ROLLBACK (fallimento esplicito) 7. SQL per le applicazioni Thursday, May 24, 2012

7. SQL per le applicazioni

Thursday, May 24, 2012

Transazioni: livelli di isolamento

Corso di Basi di Dati

15

Si può specificare il livello di isolamento per non ridurre troppo la concorrenzaTransazioni: livelli di isolamento Corso di Basi di Dati 15 SET TRANSACTION ISOLATION LEVEL { READ

SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

Livello crescente di isolamento| READ COMMITTED | REPEATABLE READ | SERIALIZABLE } 7. SQL per le applicazioni Thursday, May

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

7. SQL per le applicazioni

Thursday, May 24, 2012

Transazioni: livelli di isolamento

Corso di Basi di Dati

16

Read Uncommitted

Read Uncommitted

- letture e scritture senza lock

 

- cambiamenti prodotti da transazioni non committed sono visibili ad altre

transazioni

y:=x; T1
y:=x; T1

T2

 
- dirty read Read Committed rollback x:=x+1;

- dirty read

Read Committed

rollback x:=x+1;

- lock su ennuple, in lettura sono rilasciati subito, in scrittura alla fine della transazione

- Cambiamenti prodotti da transazioni committed sono visibili ad altre transazioni (due read ripetute possono dare risultati diversi!)

T1 z:=x; y:=x;
T1
z:=x; y:=x;

x:=x+1; T2

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

Transazioni: livelli di isolamento

17 Transazioni: livelli di isolamento

18

di isolamento 17 Transazioni: livelli di isolamento 18 Repeatable read - lock in lettura e scrittura

Repeatable read

- lock in lettura e scrittura per l’intera transazione

- se all’interno di una singola transazione si effettuano più select sulla singola riga il risultato è garantito essere sempre lo stesso SELECT Saldo FROM Conti WHERE Id=11;

- però se si selezionano più righe SELECT avg(Saldo) FROM Conti WHERE Id>11;

più righe SELECT avg(Saldo) FROM Conti WHERE Id>11; Serializable - le transazioni producono un effetto che

Serializable

- le transazioni producono un effetto che si potrebbe avere eseguendole in modo sequenziale, senza alcun interleaving

Maggiore è l’isolamento più l’esecuzione risulta lenta (sia per le attese legate ai lock, sia per la necessita di prevedere l’interazione tra transazioni).eseguendole in modo sequenziale, senza alcun interleaving la seconda interrogazione potrebbe selezionare più record

la seconda interrogazione potrebbe selezionare più record (inseriti da una transazione committed) -> valore diverso!

- vari workaround (es. index-gap locking per InnoDB)

7. SQL per le applicazioni

Thursday, May 24, 2012

Transazioni: dimensioni

Corso di Basi di Dati

19

Devono essere piccole più possibile24, 2012 Transazioni: dimensioni Corso di Basi di Dati 19 per ridurre la dimensione dei blocchi

per ridurre la dimensione dei blocchi “logici”di Basi di Dati 19 Devono essere piccole più possibile aumentare la concorrenza problemi nello spezzare

aumentare la concorrenzapossibile per ridurre la dimensione dei blocchi “logici” problemi nello spezzare in parti le transazioni occorrono

problemi nello spezzare in parti le transazionidimensione dei blocchi “logici” aumentare la concorrenza occorrono più controlli! Esempio: se realizzo come due

occorrono più controlli!

Esempio: se realizzo come due transazioni separate

Esempio: se realizzo come due transazioni separate

- verifica della presenza del prodotto

- vendita

prima della vendita devo verificare alcuni aspetti (quantità di prodotto disponibile)

prima della vendita devo verificare alcuni aspetti (quantità di prodotto disponibile)

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

7. SQL per le applicazioni

Thursday, May 24, 2012

Transazioni: deadlock e ripetizione

Corso di Basi di Dati

20

Quando c’è concorrenzaTransazioni: deadlock e ripetizione Corso di Basi di Dati 20 ci sono deadlock ! I DBMS

ci sono deadlock!

I DBMS verificano automaticaticamente la presenza di deadlock (e timeout)

I DBMS verificano automaticaticamente la presenza di deadlock (e timeout)

con uccisione delle transazioni per risolvere i deadlock (le transazioni vengono terminate una alla volta

con uccisione delle transazioni per risolvere i deadlock (le transazioni vengono terminate una alla volta iniziando dalle più piccole)

In applicazioni che operano con transazioni verificare lo stato della transazione quando termina (codice di errore) ripetizione esplicita nel caso la verificare lo stato della transazione quando termina (codice di errore) ripetizione esplicita nel caso la transazione sia stata terminata per deadlock

nel caso la transazione sia stata terminata per deadlock 7. SQL per le applicazioni Thursday, May
nel caso la transazione sia stata terminata per deadlock 7. SQL per le applicazioni Thursday, May

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

SQL e linguaggi di programmazione

Thursday, May 24, 2012

Uso di SQL da programmi: problemi

23

Come collegarsi alla BD ?Thursday, May 24, 2012 Uso di SQL da programmi: problemi 23 Come utilizzare gli operatori SQL

Come utilizzare gli operatori SQL ?di SQL da programmi: problemi 23 Come collegarsi alla BD ? Come trattare il risultato di

Come trattare il risultato di un comando SQL (relazioni) ?collegarsi alla BD ? Come utilizzare gli operatori SQL ? Come scambiare informazioni sull’esito delle operazioni

Come scambiare informazioni sull’esito delle operazioni ?? Come trattare il risultato di un comando SQL (relazioni) ? DECLARE Variabili BEGIN Istruzioni Istruzioni

DECLARE Variabili BEGIN Istruzioni Istruzioni SQL

EXCEPTION Gestori fallimenti END

DBMS

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

SQL e linguaggi di programmazione

22

Inizialmente: SQL pensato per l’uso interattivo da parte di utenti non espertiCorso di Basi di Dati SQL e linguaggi di programmazione 22 Insufficiente: difficile da usare necessità

Insufficiente:per l’uso interattivo da parte di utenti non esperti difficile da usare necessità di scrivere applicazioni

difficile da usareinterattivo da parte di utenti non esperti Insufficiente: necessità di scrivere applicazioni complesse -

necessità di scrivere applicazioni complessedi utenti non esperti Insufficiente: difficile da usare - applicazioni gestionali - analisi complesse -

- applicazioni gestionali

- analisi complesse

- applicazioni web

Tendenza attuale: SQL come componente dedicato all’accesso ai dati + linguaggio di programmazionegestionali - analisi complesse - applicazioni web 7. SQL per le applicazioni Thursday, May 24, 2012

7. SQL per le applicazioni

Thursday, May 24, 2012

Uso di SQL da programmi: soluzioni

Corso di Basi di Dati

24

Linguaggio integrato (dati e DML)Uso di SQL da programmi: soluzioni Corso di Basi di Dati 24 - linguaggio ad hoc

- linguaggio ad hoc (4GL, es. Oracle PL/SQL)

- controllo statico/compilazione delle query

Linguaggio che ospita l'SQLOracle PL/SQL) - controllo statico/compilazione delle query - costrutti per marcare i comandi SQL - un

- costrutti per marcare i comandi SQL

- un preprocessore lo traduce in linguaggio convenzionale + API

Linguaggio convenzionale + APIpreprocessore lo traduce in linguaggio convenzionale + API - funzioni di libreria per l’uso di SQL

- funzioni di libreria per l’uso di SQL (ODBC, JDBC)

- query passate come stringhe a funzioni (controllo dinamico)

- ORM

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

Linguaggio integrato PL/SQL

Thursday, May 24, 2012

Aspetti procedurali

27

PL/SQL Thursday, May 24, 2012 Aspetti procedurali 27 Codifica nello schema di informazione procedurale Stored

Codifica nello schema di informazione procedurale

Stored procedure27 Codifica nello schema di informazione procedurale - funzioni e procedure - eseguite dal DBMS su

- funzioni e procedure

- eseguite dal DBMS su richiesta delle applicazioni

Trigger- eseguite dal DBMS su richiesta delle applicazioni - procedure memorizzate - eseguite automaticamente dal DBMS

- procedure memorizzate

- eseguite automaticamente dal DBMS al verificarsi di dati eventi

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

PL/SQL

26

Linguaggio offerto dal DBMS, che estende SQLThursday, May 24, 2012 Corso di Basi di Dati PL/SQL 26 variabili scalari (e record) -

variabili scalari (e record)Dati PL/SQL 26 Linguaggio offerto dal DBMS, che estende SQL - con i tipi dei domini

- con i tipi dei domini relazionali

assegnamentoscalari (e record) - con i tipi dei domini relazionali costrutti di controllo - for, while,

costrutti di controllo(e record) - con i tipi dei domini relazionali assegnamento - for, while, cursori - per

- for, while,

cursoriassegnamento costrutti di controllo - for, while, - per operare in modo iterativo sulle ennuple restituite

- per operare in modo iterativo sulle ennuple restituite da una select

eccezioniin modo iterativo sulle ennuple restituite da una select procedure, moduli, funzioni, trigger 7. SQL per

procedure, moduli, funzioni, triggeriterativo sulle ennuple restituite da una select eccezioni 7. SQL per le applicazioni Thursday, May 24,

7. SQL per le applicazioni

Thursday, May 24, 2012

Stored Procedures: Perché?

Corso di Basi di Dati

28

Permettono di condividere il codice tra applicazioni, con una gestione centralizzata centralizzata

Garantiscono una semantica prefissata per le operazioni sulla BD che implementano implementano

Permettono di implementare vincoli di integrità semantici, non esprimibili nel modello dei dati modello dei dati

Riducono il traffico di reteintegrità semantici, non esprimibili nel modello dei dati Migliorano sicurezza e astrazione 7. SQL per le

Migliorano sicurezza e astrazionenel modello dei dati Riducono il traffico di rete 7. SQL per le applicazioni Thursday, May

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

Funzioni

29 Funzioni

30

Sintassi molto variabile (qui MySQL)Funzioni 29 Funzioni 30 Es.: CREATE FUNCTION contaStudenti () RETURNS INT BEGIN DECLARE numStudenti INT; SELECT

Es.:Funzioni 29 Funzioni 30 Sintassi molto variabile (qui MySQL) CREATE FUNCTION contaStudenti () RETURNS INT BEGIN

29 Funzioni 30 Sintassi molto variabile (qui MySQL) Es.: CREATE FUNCTION contaStudenti () RETURNS INT BEGIN

CREATE FUNCTION contaStudenti () RETURNS INT BEGIN DECLARE numStudenti INT; SELECT COUNT(*) INTO numStudenti FROM Studenti; RETURN numStudenti; END

Una volta definite sono richiamabili come normali funzioni predefinite.numStudenti FROM Studenti; RETURN numStudenti; END SELECT contaStudenti(); SELECT WHERE contaStudenti() >

SELECT contaStudenti(); contaStudenti();

SELECTcome normali funzioni predefinite. SELECT contaStudenti(); WHERE contaStudenti() > Es: Media degli esami sostenuti

WHERE contaStudenti() >

Es: Media degli esami sostenuti da almeno un terzo degli studenti:SELECT contaStudenti(); SELECT WHERE contaStudenti() > FROM SELECT Esami Materia, AVG(Voto) HAVING GROUP BY

FROM SELECT Esami Materia, AVG(Voto) HAVING GROUP BY COUNT(*) Materia > contaStudenti()/3;

7. SQL per le applicazioni

Thursday, May 24, 2012

Funzioni

Corso di Basi di Dati

31

Le funzioni possono avere dei parametri di inputThursday, May 24, 2012 Funzioni Corso di Basi di Dati 31 Esempio: Media dei voti per

Esempio:di Dati 31 Le funzioni possono avere dei parametri di input Media dei voti per una

Media dei voti per una provincia, ritorna A, B o C se la media è negli intervalli

A: [18-22] B: (22,26] C: (26,30]

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

7. SQL per le applicazioni

Thursday, May 24, 2012

Funzioni

Corso di Basi di Dati

32

CREATE BEGIN FUNCTION Media (AProvincia CHAR(2)) RETURNS CHAR(1) DECLARE DECLARE Media Res CHAR(1); FLOAT; SELECT FROM WHERE Studenti s.Provincia=AProvincia; AVG(e.Voto) s JOIN INTO Esami Media e ON (s.Matricola=e.Candidato)

IF Media SET Res="A"; BETWEEN 18 AND 22 THEN ELSEIF SET Media Res="B"; <= 26 THEN

ELSE END SET IF; Res="C";

RETURN Res;

!

!

END

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

Procedure

33 Procedure

34

Procedura per l’inserimento di uno studenteProcedure 33 Procedure 34 La procedura si richiama con CALL CREATE ( IN PROCEDURE num AMatricola

La procedura si richiama con CALL CALL

CREATE (IN PROCEDURE num AMatricola INT, insStud ANome CHAR(6), VARCHAR(10), AProvincia ACognome CHAR (2), VARCHAR(10), OUT ok BOOL)

BEGIN IF SELECT DECLARE numStudenti<num COUNT(*) numStudenti INTO THEN INT; numStudenti FROM Studenti; INSERT SET ok=1; INTO Studenti VALUES (ANome,ACognome,AMatricola,AProvincia); (Nome, Cognome, Matricola, Provincia) ELSE END SET IF; ok=0; END

7. SQL per le applicazioni

Thursday, May 24, 2012

Creazione di procedure e funzioni

Corso di Basi di Dati

35

NOTA: Occorre cambiare i delimitatoriCreazione di procedure e funzioni Corso di Basi di Dati 35 delimiter $ <definizione>$ delimiter ;

delimiter $

<definizione>$

delimiter ;

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

Es. CALL insStud(7,'Giulio','Cesare','71228','BL',@o); CALL insStud(7,'Giulio','Cesare','71228','BL',@o);

Nota: @o variabile utente (si opera con SET @o= @o variabile utente (si opera con SET @o=

, ecc.)

7. SQL per le applicazioni

Thursday, May 24, 2012

Cursore

Corso di Basi di Dati

36

Meccanismo per ottenere uno alla volta gli elementi di una relazioneThursday, May 24, 2012 Cursore Corso di Basi di Dati 36 Definito con un' espressione SQL

Definito con un'espressione SQL , poi espressione SQL, poi

Si apre per far calcolare al DBMS il risultato e poi apre per far calcolare al DBMS il risultato e poi

con un opportuno comando si trasferiscono i campi della prossima ennupla in opportune variabili del programma.poi Si apre per far calcolare al DBMS il risultato e poi O P E N

OPEN

FETCH

CLOSE

Risultato
Risultato
variabili del programma. O P E N FETCH CLOSE Risultato 7. SQL per le applicazioni Thursday,

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

Cursore: sintassi

37 Cursore: quando finiscono i dati

38

Dichiara il cursore, associandogli una query DECLARE cursor_name CURSOR FOR SELECT_statement ; DECLARE cursor_name CURSOR FOR SELECT_statement;

Apre il cursorequery DECLARE cursor_name CURSOR FOR SELECT_statement ; Quando non ci sono più dati si solleva un

cursor_name CURSOR FOR SELECT_statement ; Apre il cursore Quando non ci sono più dati si solleva

Quando non ci sono più dati si solleva un errore di tipo “NOT FOUND ” che va catturato con un HANDLER DECLARE <type> HANDLER FOR <cond> statement NOT FOUND” che va catturato con un HANDLER DECLARE <type> HANDLER FOR <cond> statement

<type> HANDLER FOR <cond> statement OPEN cursor_name ; Recupera la prossima riga,

OPEN cursor_name ; cursor_name;

Recupera la prossima riga, memorizzandone i campi in una lista di variabili FETCH cursor_name INTO variable list; FETCH cursor_name INTO variable list;

Chiude il cursore CLOSE cursor_name ; CLOSE cursor_name;

INTO variable list; Chiude il cursore CLOSE cursor_name ; <type> -> CONTINUE , EXIT <cond>
INTO variable list; Chiude il cursore CLOSE cursor_name ; <type> -> CONTINUE , EXIT <cond>
<type> -> CONTINUE , EXIT

<type> -> CONTINUE, EXIT

<cond> -> condizione di errore (specifico valore o classi SQLWARNING, NOT FOUND, SQLEXCEPTION )

<cond> -> condizione di errore (specifico valore o classi SQLWARNING, NOT FOUND, SQLEXCEPTION)

Esempio:valore o classi SQLWARNING, NOT FOUND, SQLEXCEPTION ) DECLARE CONTINUE HANDLER FOR NOT FOUND SET Done

o classi SQLWARNING, NOT FOUND, SQLEXCEPTION ) Esempio: DECLARE CONTINUE HANDLER FOR NOT FOUND SET Done

DECLARE CONTINUE HANDLER FOR NOT FOUND SET

Done = 1

7. SQL per le applicazioni

Thursday, May 24, 2012

Cursore: Esempio

Corso di Basi di Dati

39

CREATE BEGIN PROCEDURE Migliori (IN Soglia INT) /* /* fa con qualcosa media > sulle Soglia materie */ */ DECLARE DECLARE Done Media INT FLOAT; DEFAULT 0; DECLARE CMateria CHAR(3);

DECLARE ! SELECT Cur CURSOR Materia, FOR AVG(Voto) FROM Esami GROUP BY Materia; DECLARE CONTINUE HANDLER FOR NOT FOUND

! SET Done = 1;

OPEN Cur; REPEAT FETCH IF NOT Cur Done INTO THEN CMateria, Media; IF Media > Soglia THEN UNTIL CLOSE END Done cur; END IF; IF; END REPEAT; END

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

7. SQL per le applicazioni

Thursday, May 24, 2012

Cursore: Esempio

Corso di Basi di Dati

40

CREATE BEGIN PROCEDURE Migliori (IN Soglia INT) /* /* fa con qualcosa media > sulle Soglia materie */ */ DECLARE DECLARE Media CMateria FLOAT; CHAR(3);

DECLARE ! SELECT Cur CURSOR Materia, FOR AVG(Voto) FROM Esami GROUP BY Materia; DECLARE EXIT HANDLER FOR NOT FOUND

! BEGIN END;

OPEN Cur; LOOP FETCH IF Media Cur > INTO Soglia CMateria, THEN Media;

END IF; END CLOSE END LOOP; cur;

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

Variabili

41 Variabili: ordine di valutazione

42

Assegnamento SET @var=expr SET @var=expr

ordine di valutazione 42 Assegnamento SET @var=expr SET @var:= Es. SET @a=0; SELECT if(@a,@a:=@a+1,@a:=1)

SET @var:= @var:=

Es. SET @a=0; SELECT if(@a,@a:=@a+1,@a:=1) AS Num , s.Cognome , s.Nome FROM Studenti s; SET @a=0; SELECT if(@a,@a:=@a+1,@a:=1) AS Num, s.Cognome, s.Nome FROM Studenti s;

SELECT (@nome:=s.Nome) FROM WHERE s.Matricola='71347'

Studenti s

Quello già indicato per SELECTFROM WHERE s.Matricola='71347' Studenti s SET @a=71347; SELECT if(@a,@a:=@a+1,@a:=1) s.Cognome,

SET @a=71347; SELECT if(@a,@a:=@a+1,@a:=1) s.Cognome, s.Nome AS Num, s.Matricola, FROM WHERE s.Matricola=@a;

Studenti s

+-------+-----------+---------+---------+

| Num

| Matricola | Cognome | Nome

|

+-------+-----------+---------+---------+

| 71348 | 71347

| Zeri

| Giorgio |

+-------+-----------+---------+---------+

7. SQL per le applicazioni

Thursday, May 24, 2012

Trigger

Corso di Basi di Dati

43

Thursday, May 24, 2012 Trigger Corso di Basi di Dati 43 Procedure eseguite dal DBMS in

Procedure eseguite dal DBMS in corrispondenza del verificarsi di un determinato evento CREATE TRIGGER Nome PrimaODopoDi Evento {, Evento} ON Tabella [Granularità] Azione

Evento {, Evento} ON Tabella [Granularità] Azione PrimaODopoDi := BEFORE | AFTER Evento := INSERT |

PrimaODopoDi := BEFORE | AFTER

Evento := INSERT | DELETE | UPDATE OF Attributi

Granularità := FOR EACH ROW | FOR EACH STATEMENT

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

7. SQL per le applicazioni

Thursday, May 24, 2012

Esempio di Trigger

Corso di Basi di Dati

44

Controlla se il voto da inserire per un esame è nel range correttoMay 24, 2012 Esempio di Trigger Corso di Basi di Dati 44 CREATE TRIGGER ControlloVoto BEFORE

CREATE TRIGGER ControlloVoto BEFORE INSERT ON Esami FOR EACH ROW BEGIN IF ( NEW .Voto < 18) ControlloVoto BEFORE INSERT ON Esami FOR EACH ROW BEGIN IF (NEW.Voto < 18) OR (NEW.Voto > 30) THEN RAISE_APPLICATION_ERROR(-21, ‘Voto errato’); END IF; END;

MySQL non offre RAISE_APPLICATION_ERROR. RAISE_APPLICATION_ERROR.

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

Esempio di Trigger

45 Esempio di Trigger

46

CREATE TRIGGER ControlloStipendio BEFORE INSERT ON Impiegati BEGIN DECLARE StipendioMedio FLOAT; ! ControlloStipendio BEFORE INSERT ON Impiegati BEGIN DECLARE StipendioMedio FLOAT; !

SELECT avg(Stipendio) INTO StipendioMedio FROM Impiegati WHERE Dipartimento = NEW.Dipartimento; IF NEW.Stipendio > 2 * StipendioMedio THEN RAISE_APPLICATION_ERROR(-2061, ‘Stipendio alto’) END IF; END;

CREATE TRIGGER ControlloStipendio BEFORE UPDATE ON Impiegati BEGIN IF NEW .Stipendio < OLD .Stipendio THEN ControlloStipendio BEFORE UPDATE ON Impiegati BEGIN IF NEW.Stipendio < OLD.Stipendio THEN RAISE_APPLICATION_ERROR(-2068, ‘Lo stipendio non può diminuire’)

END IF;

END;

7. SQL per le applicazioni

Thursday, May 24, 2012

Trigger Attivi e Passivi

Corso di Basi di Dati

47

Trigger Passivi: verificano una condizione che, se non soddisfatta, determina il fallimento della transazione : verificano una condizione che, se non soddisfatta, determina il fallimento della transazione

- vincoli di integrità dinamici

- accessi di utenti che dipendono dallo stato della BD (funz. USER())

Trigger Attivi: in corrispondenza di un evento, modificano lo stato della BD : in corrispondenza di un evento, modificano lo stato della BD

- business rules (manuntenzione di archivi, generazione ciclica di rapporti, )

- memorizzazione di eventi nella BD (logging, auditing)

- solo transazioni terminate? Dipende dalla semantica dei trigger

- propagazione ad altre tabelle degli effetti delle modifiche

- allineamento di dati duplicati

- vincoli di integrità (es. referenziale, se non gestita dal DBMS)

invio di solleciti,

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

7. SQL per le applicazioni

Thursday, May 24, 2012

Vantaggi dei Trigger

Corso di Basi di Dati

48

semplifica le applicazioni, sgravate dei controlli nei triggerMay 24, 2012 Vantaggi dei Trigger Corso di Basi di Dati 48 gestione centralizzata dei controlli,

gestione centralizzata dei controlli, con ovvi vantaggile applicazioni, sgravate dei controlli nei trigger vincoli di integrità complessi 7. SQL per le applicazioni

vincoli di integrità complessigestione centralizzata dei controlli, con ovvi vantaggi 7. SQL per le applicazioni Thursday, May 24, 2012

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

Svantaggi dei Trigger

49

Semantica non ovviaSvantaggi dei Trigger 49 - Quando viene eseguito (es. per una update)? Ad ogni riga aggiornata

- Quando viene eseguito (es. per una update)? Ad ogni riga aggiornata o per ogni statement?

- Oracle e Postgres permettono di definirlo

- MySQL per riga

- Ordine di esecuzione se più trigger sono attivi

- Effetto cascata e terminazione

- Parte della transazione o transazione separata?

Problemi di progettazione- Parte della transazione o transazione separata? - difficile controllare l’effetto complessivo dei trigger

- difficile controllare l’effetto complessivo dei trigger

- rigidità (stati intermedi non consistenti?)

7. SQL per le applicazioni

Thursday, May 24, 2012

SQLJ: SQL embedded in Java

Corso di Basi di Dati

51

Standard ISO per istruzioni SQL immerse in programmi Java Tradotto da un precompilatore in Java standard + API24, 2012 SQLJ: SQL embedded in Java Corso di Basi di Dati 51 public

public Oracle.connect("jdbc:oracle:oci:@localhost:1521:mydb", static void main(String argv[]){ #SQL GetNomeIter iterator iter; GetNomeIter(String "baldan", "pwd"); Nome, int AnnoNascita); #SQL System.out.println("Nomi iter = {SELECT from Studenti Nome, trovati:"); AnnoNascita where Provincia =:(argv[0])}; while String int (iter.next()) anno nome = iter.Anno(); = iter.Nome(); { System.out.println("Nome =" + nome + "Anno:" + anno); iter.close(); Oracle.close();

}

}

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

Thursday, May 24, 2012

SQL embedded

SQLJ: SQL embedded in Java

52

#SQL { SELECT Nome into :nome WHERE FROM Matricola Studenti = :matricola } System.out.println("Nome "Matricola:" =" + nome + matricola); +

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

SQL embedded in C

53

char SQLSTATE[6]; EXEC SQL BEGIN DECLARE SECTION char c_sname[20]; short c_annoNascita; EXEC SQL END DECLARE SECTION short c_Provincia = “Padova”; EXEC SQL DECLARE stud_info CURSOR FOR SELECT S.nome, S.annoNascita FROM Studenti S WHERE S.Provincia = :c_Provincia ORDER BY S.nome; do { EXEC SQL FETCH stud_info INTO :c_snome, :c_annoNascita; printf(“Nome:%s; AnnoNascita: %s \n ”, c_snome, c_annoNascita); } while (SQLSTATE != ‘02000’); EXEC SQL CLOSE stud_info;

7. SQL per le applicazioni

Thursday, May 24, 2012

Linguaggio + API

Corso di Basi di Dati

55

Libreria (API) di funzioni/classi che operano su basi di dati ricevono come parametro stringhe SQL ricevono come parametro stringhe SQL

su basi di dati ricevono come parametro stringhe SQL ritornano il risultato con una logica ad

ritornano il risultato con una logica ad iteratori iteratori

StandardSQL ritornano il risultato con una logica ad iteratori - ODBC (origine Microsoft - standard su

- ODBC (origine Microsoft - standard su Windows)

- JDBC (origine Sun) è l'equivalente in Java

Dovrebbero essere indipendenti dal DBMS un “driver” gestisce le richieste e le traduce per lo specifico DBMS la BD può un “driver” gestisce le richieste e le traduce per lo specifico DBMS la BD può essere in rete

e le traduce per lo specifico DBMS la BD può essere in rete 7. SQL per
e le traduce per lo specifico DBMS la BD può essere in rete 7. SQL per

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

Thursday, May 24, 2012

JDBC

Linguaggio + API

56

public DriverManager static void = Class.forName("com.mysql.jdbc.Driver"); main(String argv[]){ // driver per DBMS Connection con DriverManager.getConnection("url", = // connect "login", "pass"); Statement String query stmt = = "SELECT con.createStatement(); Nome, AnnoNascita // oggetto per comando SQL ResultSet iter = FROM stmt.executeQuery(query); Studenti WHERE Provincia =‘" + argv[0] + " "; System.out.println("Nomi try { // gestore eccezioni trovati:"); while String int System.out.println(" (iter.next()) anno nome = iter.getInt("AnnoNascita"); = iter.getString("Nome"); { Nome: " + nome + “; AnnoNascita: " + anno);

// ciclo sul risultato

}

stmt.close(); } System.out.println(ex.getMessage()+ex.getSQLState()+ex.getErrorCode());} catch(SQLException con.close(); ex) {

}

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

ORM (Object relational mapping)

57 ORM

58

ORM (Object relational mapping) 57 ORM 58 Come risolvere il problema di impedenza, conciliando il DBMS

Come risolvere il problema di impedenza, conciliando il DBMS relazionale con un linguaggio ad oggetti Varie tecniche basate sulla creazione di uno strato software che ‘virtualizza’ l’accesso al DB

uno strato software che ‘virtualizza’ l’accesso al DB ~ Persistent objects Idee : tabella del DB
uno strato software che ‘virtualizza’ l’accesso al DB ~ Persistent objects Idee : tabella del DB

~ Persistent objects

Idee: :

tabella del DB <-> classe del DB <-> classe

record della tabella <-> oggetto istanza della classe della tabella <-> oggetto istanza della classe

colonne della tabella <-> attributi dell’oggetto della tabella <-> attributi dell’oggetto

instance methods ( crud - create, read, update, delete) ); (crud - create, read, update, delete) );

studente studente.save(); = new Studente(Lino,

7. SQL per le applicazioni

Thursday, May 24, 2012

ORM - gestione delle associazioni

Corso di Basi di Dati

59

associazioni univoche codificate come codificate come

metodi che ritornano un oggetto studente.Tutor(); -

metodi che ritornano un oggetto studente.Tutor();

-

o semplicemente come attributi (di tipo oggetto)

o

semplicemente come attributi (di tipo oggetto)

(lazy fetch evita che caricando un oggetto si carichino oggetti non utili ad esso collegati - es. potrei non voler sapere niente del tutor)

associazioni multivalore metodi che ritornano insiemi (array, metodi che ritornano insiemi (array,

multivalore metodi che ritornano insiemi (array, - studente.Esami() ) di oggetti impossibile dimenticarsi di

- studente.Esami()

) di oggetti

impossibile dimenticarsi di SQL e del database sottostante funzionalità lo richiederannoritornano insiemi (array, - studente.Esami() ) di oggetti alcune 7. SQL per le applicazioni Thursday, May

alcune

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

- NB: serve sapere se lo studente è nuovo o meno (update o insert?)

class methods - query sulla tabella query sulla tabella

- gli studenti con voti > k:

Studenti.getVoti(k))

7. SQL per le applicazioni

Thursday, May 24, 2012

ORM

Corso di Basi di Dati

60

riferimentiThursday, May 24, 2012 ORM Corso di Basi di Dati 60 Hibernate - Java (il primo

Hibernate - Java (il primo ~ 2002)May 24, 2012 ORM Corso di Basi di Dati 60 riferimenti EDM - C# (Entity Data

EDM - C# (Entity Data Model) - Microsoft ) )

Active records (Ruby on Rails, CakePHP,primo ~ 2002) EDM - C# (Entity Data Model) - Microsoft ) Sulla base di persistenza

Sulla base di persistenza poggiano vari Web Application Framework basati sul design pattern MVC (Model View Control)- Microsoft ) Active records (Ruby on Rails, CakePHP, 7. SQL per le applicazioni Thursday, May

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati

E noi?

61

Noi utilizzeremo come linguaggio “ospite” PHP PHP

con l’approccio linguaggio + API linguaggio + API

sfruttando una API specifica per MySQL“ospite” PHP con l’approccio linguaggio + API 7. SQL per le applicazioni Thursday, May 24, 2012

7. SQL per le applicazioni

Thursday, May 24, 2012

Corso di Basi di Dati