Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Paolo Baldan
baldan@math.unipd.it
http://www.math.unipd.it/~baldan
Programma di massima
Transazioni
SQL per le applicazioni
PL/SQL
Transazioni
Transazioni
(o thread)
visibile, oppure fallisce (aborted) e non ha alcun effetto sulla base di dati
visibile, oppure fallisce (aborted) e non ha alcun effetto sulla base di dati
Consistenza: la transazione porta la BD da uno stato consistente ad un altro
stato consistente (e.g., che soddisfa i vincoli di integrit)
visibile, oppure fallisce (aborted) e non ha alcun effetto sulla base di dati
visibile, oppure fallisce (aborted) e non ha alcun effetto sulla base di dati
Transazioni
Transazioni
Id
Saldo
01
10000
Es. Nel frattempo potrebbe essere fatto un altro prelievo sul conto con
02
15000
Id="01" ....
03
2000
Come si fa?
10
Sintassi
Meccanismi di locking
prima di leggere / modificare un dato una transazione lo blocca (in lettura o
lettura/scrittura)
- record
- table
se una transazione T2 tenta di acquisire un lock su di un dato gi bloccato da
T1, viene messa in attesa
Comandi
lock/unlock (su tabelle e/o blocchi di righe, gestito dallutente)
start transaction/commit/rollback (ci si affida al dbms)
7. SQL per le applicazioni
11
Esempio:
12
autocommit on
stato di default
autocommit off
UNLOCK TABLES
MySQL:
13
possibile specificare (es. per MySQL InnoDB) che una sequenza di query
14
START TRANSACTION
implicitamente con la prima istruzione su tabelle (SELECT, UPDATE,
START TRANSACTION;
INSERT)
14
15
START TRANSACTION
implicitamente con la prima istruzione su tabelle (SELECT, UPDATE,
SET TRANSACTION ISOLATION LEVEL
INSERT)
{ READ UNCOMMITTED |
termina con
READ COMMITTED |
REPEATABLE READ |
SERIALIZABLE }
Read Uncommitted
16
Read Committed
17
Lock su ennuple
in lettura sono rilasciati subito
transazioni
dirty read
T2
x:=x+1;
rollback
T1
y:=x;
z:=x;
Repeatable read
T2
x:=x+1;
18
Repeatable read
18
Repeatable read
18
Repeatable read
18
Serializable
19
Transazioni: dimensioni
20
aumentare la concorrenza
problemi nello spezzare in parti le transazioni .. occorrono pi controlli!
21
23
Inizialmente: SQL pensato per luso interattivo da parte di utenti non esperti
Insufficiente:
difficile da usare
24
- applicazioni gestionali
- analisi complesse
DECLARE
Variabili
- applicazioni web
BEGIN
Istruzioni
Istruzioni SQL
Tendenza attuale: SQL come componente dedicato alla gestione dei dati +
linguaggio di programmazione
DBMS
EXCEPTION
Gestori fallimenti
END
25
25
25
Linguaggio integrato
PL/SQL
PL/SQL
27
Aspetti procedurali
28
Stored procedure
- funzioni e procedure
assegnamento
costrutti di controllo
- for, while, ...
Trigger
cursori
- procedure memorizzate
- eseguite automaticamente dal DBMS al verificarsi di dati eventi
29
Funzioni
30
implementano
BEGIN
DECLARE numStudenti INT;
RETURN numStudenti;
END
Funzioni
31
Funzioni
31
SELECT contaStudenti();
SELECT contaStudenti();
SELECT
SELECT
Funzioni
32
Funzioni
33
A: [18-22]
B: (22,26]
!
C: (26,30]
END
7. SQL per le applicazioni
Procedure
34
Procedure
35
CALL insStud(7,'Giulio','Cesare','71228','BL',@o);
Nota: @o variabile utente (si opera con SET @o= ..., ecc.)
BEGIN
DECLARE numStudenti INT;
SELECT COUNT(*) INTO numStudenti FROM Studenti;
IF numStudenti<num THEN
SET ok=TRUE;
INSERT INTO Studenti (Nome, Cognome, Matricola, Provincia)
VALUES (ANome,ACognome,AMatricola,AProvincia);
ELSE
SET ok=FALSE;
END IF;
END
7. SQL per le applicazioni
36
Cursore
37
Meccanismo per ottenere uno alla volta gli elementi di una relazione
Definito con un'espressione SQL, poi
delimiter $
<definizione>$
delimiter ;
Risultato
FETCH
CLOSE
7. SQL per le applicazioni
Cursore: sintassi
38
Cursore: sintassi
38
Cursore: sintassi
38
Cursore: sintassi
38
Apre il cursore
Apre il cursore
OPEN cursor_name;
OPEN cursor_name;
39
39
Quando non ci sono pi dati si solleva un errore di tipo NOT FOUND che va
Quando non ci sono pi dati si solleva un errore di tipo NOT FOUND che va
DECLARE
DECLARE
statement
FOUND, SQLEXCEPTION)
FOUND, SQLEXCEPTION)
Esempio:
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET
Done = 1
Cursore: Esempio
40
Cursore: Esempio
BEGIN
DECLARE EXIT HANDLER FOR NOT FOUND
!
BEGIN END;
OPEN Cur;
REPEAT
FETCH Cur INTO CMateria, Media;
IF NOT Done THEN
IF Media > Soglia THEN
...
END IF;
END IF;
UNTIL Done END REPEAT;
CLOSE cur;
END
41
OPEN Cur;
LOOP
FETCH Cur INTO CMateria, Media;
IF Media > Soglia THEN
...
END IF;
END LOOP;
END;
CLOSE cur;
END
Corso di Basi di Dati
Variabili
42
Assegnamento
43
SET @var=expr
SET @a=71347;
SET @var:= ...
SELECT if(@a,@a:=@a+1,@a:=1) AS Num, s.Matricola,
s.Cognome, s.Nome
FROM
Studenti s
WHERE s.Matricola=@a;
Es.
SET @a=0;
SELECT if(@a,@a:=@a+1,@a:=1) AS Num, s.Cognome, s.Nome
FROM Studenti s;
+-------+-----------+---------+---------+
| Num
| Matricola | Cognome | Nome
|
+-------+-----------+---------+---------+
| 71348 | 71347
| Zeri
| Giorgio |
+-------+-----------+---------+---------+
SELECT (@nome:=s.Nome)
FROM
Studenti s
WHERE
s.Matricola='71347'
Trigger
44
45
determinato evento
Evento {, Evento}
ON Tabella
BEGIN
[Granularit]
Azione
PrimaODopoDi
Esempio di Trigger
:= BEFORE | AFTER
END;
Evento := INSERT | DELETE | UPDATE OF Attributi
Granularit :=
7. SQL per le applicazioni
Esempio di Trigger
46
Esempio di Trigger
BEGIN
BEGIN
47
Impiegati
WHERE
Dipartimento = NEW.Dipartimento;
pu diminuire)
END IF;
END;
48
48
49
50
52
SQL embedded
53
54
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;
...
#SQL { SELECT Nome into :nome
FROM
Studenti
WHERE Matricola = :matricola }
SQL embedded in C
Linguaggio + API
56
Linguaggio + API
Standard
- 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 essere in rete
JDBC
57
58
laccesso al DB
~ Persistent objects
ORM
59
Idee:
60
- studente.Tutor();
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, ...) di oggetti
- studente.Esami()
funzionalit lo richiederanno
ORM
61
riferimenti
E noi?
62