APPENDICE • • • • Procedure in SQL Transazioni in SQL Embedded SQL Remote Procedure Call F.Cesarini - Basi Dati Distribuite Appendice 1 Procedure in SQL (1) • • • • Standard SQL2 permette di definire procedure, associate a singoli comandi SQL, memorizzate all’interno del database (vanno a far parte dello schema) Una procedura associa un nome ad un comando e permette il passaggio di parametri Una procedura può essere richiamata dall’interno di un programma specificando il valore dei parametri I DBMS permettono in genere la definizione di procedure in modo più sofisticato di quanto previsto dallo standard SQL2 F.Cesarini - Basi Dati Distribuite Appendice 2 1 Procedure in SQL (2) esempio di procedura standard SQL-2 procedure Assegnacitta (:Dip char(20), :Citta char (20)) update Dipartimento set Città = :Citta where Nome = :Dip; Questa procedura può essere richiamata da un programma … nomecitta = ‘Firenze’; nomedip = ‘sistemi’; … Assegnacitta ( :nomedip, :nomecitta) … F.Cesarini - Basi Dati Distribuite Appendice 3 Procedure in SQL (3) estensioni allo standard SQL-2 • Esempi di estensioni sono – Sequenze di comandi – Strutture di controllo (if-then-else) – Definizione di variabili locali • • Ogni sistema da delle possibilità in questo ambito, che però si diversificano anche nella sintassi Alcuni sistemi commerciali forniscono una estensione di SQL che è un vero e proprio linguaggio di programmazione con cui è possibile scrivere intere applicazioni – ORACLE: linguaggio PL/SQL F.Cesarini - Basi Dati Distribuite Appendice 4 2 TRANSAZIONI IN SQL (1) • Comandi generali per le transazioni BEGIN TRANSACTION END TRANSACTION COMMIT WORK ROLLBACK WORK • • I comandi begin transaction e end transaction racchiudono le istruzioni che compongono il corpo della transazione Il comando commit work segnala al sistema che gli effetti sul database devono essere resi permanenti – deve essere eseguita uma operazione di commit • Il comando rollback work segnala al sistema che gli effetti delle istruzioni eseguite fino a quel momento devono essere annullati – deve essere eseguita una operazione di abort • La sintassi SQL non prevede tutti questi comandi espliciti F.Cesarini - Basi Dati Distribuite Appendice 5 TRANSAZIONI IN SQL (2) • Non esistono i comandi begin transaction e end transaction • Esistono invece commit e rollback • Una istruzione SQL è implicitamente la prima istruzione di una transazione (transazione corrente) se non esiste già una transazione corrente • I comandi commit e rollback segnalano anche la fine della transazione • Ogni istruzione SQL che segue un commit o un rollback è la prima istruzione di una nuova transazione • Il comando set transaction serve ad eventualmente definire le caratteristiche della transazione corrente F.Cesarini - Basi Dati Distribuite Appendice 6 3 TRANSAZIONI IN SQL (3) comando COMMIT • Operazioni eseguite a seguito di un comando COMMIT – Viene eseguito un CLOSE implicito per ogni cursore aperto (cfr. embedded SQL) – Viene eseguito un SET CONSTRAINTS ALL IMMEDIATE implicito • il controllo dei vincoli di integrità può essere INITIALLY DEFERRED al momento della loro definizione (cfr. cicli nei vincoli di integrità referenziale) – Viene eseguito un DELETE FROM T per ogni T temporanea per cui era stato specificato un ON COMMIT DELETE – Vengono rese permanenti tutte le modifiche effettuate dalla transazione • Se qualcuna di queste azioni fallisce (ad es. il controllo dei vincoli) la transazione fallisce e va in rollback F.Cesarini - Basi Dati Distribuite Appendice 7 TRANSAZIONI SQL (4) comando ROLLBACK • Operazioni eseguite a seguito di un comando ROLLBACK – Viene eseguito un CLOSE implicito per ogni cursore aperto (cfr. embedded SQL) – Tutte le modifiche effettuate dalla transazione vengono cancellate (“undo”) – La transazione è terminata senza successo F.Cesarini - Basi Dati Distribuite Appendice 8 4 TRANSAZIONI SQL (5) comando SET TRANSACTION (1) • Il comando SET TRANSACION viene usato per definire le caratteristiche della transazione che sta per essere avviata riguardo al – Modo di accesso – Dimensione dell’area diagnostica – Livello di isolamento • Modo di accesso – READ ONLY (le modifiche sono proibite) – READ WRITE • Dimensione dell’area diagnostica – DIAGNOSTIC SIZE n (n indica il numero di condizioni che vengono mantenute) F.Cesarini - Basi Dati Distribuite Appendice 9 TRANSAZIONI SQL (6) comando SET TRANSACTION (2) • Livello di isolamento ISOLATION LEVEL SERIALIZABLE – Viene garantito che le transazioni concorrenti siano eseguite in modo serializzabile (modo di default) – Non può verificarsi nessuna delle seguenti condizioni • Dirty read (es: T1 aggiorna una riga, T2 legge quella riga, T1 va in rollback quindi T2 ha un dato non corretto) • Nonrepeatable read (es: T1 legge una riga, T2 modifica quella riga, T1 legge di nuovo quella riga quindi ora legge un dato diverso) • Phantoms (es: T1 legge un insieme di righe che soddisfano una certa condizione, T2 inserisce una riga che soddisfa quella stessa condizione, T1 legge nuovamente l’insieme di righe che soddisfa quella condizione quindi ora vede un fantasma, cioè una riga che prima non esisteva) F.Cesarini - Basi Dati Distribuite Appendice 10 5 TRANSAZIONI SQL (7) comando SET TRANSACTION (3) • Livello di isolamento ISOLATION LEVEL REPEATABLE READ – Può verificarsi la condizione phantom • Livello di isolamento ISOLATION LEVEL READ COMMITTED – Possono verificarsi le condizioni nonrepeatable read e phantom • Livello di isolamento ISOLATION LEVEL READ UNCOMMITTED – Possono verificarsi le condizioni dirty read, nonrepeatable read e phantom • • Un sistema che supporta qualcuno di questi tre livelli, di solito fornisce anche un qualche comando di LOCK per gestire autonomamente i possibili conflitti I comandi di LOCK non sono previsti da SQL-2 F.Cesarini - Basi Dati Distribuite Appendice 11 SQL Embedded (1) • • Le istruzioni SQL sono inserite direttamente nel programma sorgente Una istruzione SQL deve – essere preceduta da exec SQL – terminare con ; • • • La compilazione del programma sorgente deve essere preceduta dal richiamo di un preprocessore che sostituisce le istruzioni SQL con opportune chiamate a librerie Deve quindi essere disponibile un preprocessore opportuno per il linguaggio utilizzato e il DBMS a cui si vuole accedere L’integrazione tra SQL e linguaggi di programmazione deve affrontare il cosiddetto impedance mismatch (conflitto di impedenza) – SQL opera su intere tabelle, è di tipo set oriented – i linguaggi di programmazione accedono ad una tabella una riga alla volta, tuple oriented F.Cesarini - Basi Dati Distribuite Appendice 12 6 SQL Embedded (2) • SQL embedded fornisce un approccio “statico” alla programmazione che accede a database – Il testo della frase SQL è scritto all’interno del programma – Può essere cambiato solo riprocessando il sorgente • Un approccio più dinamico si può avere utilizzando chiamate di funzioni, API, Application Programing Interface – In questo caso però il controllo sui comandi SQL (per es. il controllo sintattico) può essere fatto solo al momento dell’esecuzione • • SQl embedded usa il concetto di cursore per recuperare le tuple risultato della select una alla volta Nel caso venga recuperata una sola tupla può essere usata una istruzione alternativa, che fa a meno del cursore, e pone i valori recuperati direttamente in variabili F.Cesarini - Basi Dati Distribuite Appendice 13 SQL Embedded (3) • • Negli esempi facciamo riferimento al linguaggio ospite C Possono essere definite delle variabili condivise fra il programma C e i comandi SQL – Le variabili condivise devono essere dichiarate in una opportuna sezione: EXEC SQL BEGIN DECLARE SECTION … EXEC SQL END DECLARE SECTION – I comandi SQL si riferiscono alle variabili condivise facendole precedere da : – SQLCODE e SQLSTATE sono variabili usate dal DBMS per comunicare condizioni di errore o eccezioni, spesso sono campi del record SQLCA F.Cesarini - Basi Dati Distribuite Appendice 14 7 Esempio 1 procedura C [?] Void VisualizzaStipendiDipart (char NomeDip[]) { exec sql begin declare section; char Nome[20], Cognome [20]; long int Stipendio; exec sql end declare section; exec sql declare ImpDip cursor for select Nome, Cognome, Stipendio from Impiegato where Dipart = :NomeDip; exec sql open ImpDip; exec sql fetch ImpDip into :Nome, :Cognome, :Stipendio; printf (“Dipartimento %s\n”, NomeDip); while (sqlca.code == 0) { printf (“L’impiegato %s %s”, Nome, Cognome); printf (“ha stipendio %d\n”, Stipendio); exec sql fetch ImpDip into :Nome, :Cognome, :Stipendio; } exec sql close cursor ImpDip; } F.Cesarini - Basi Dati Distribuite Appendice 15 Esempio 2 segmento codice C … prompt (“Immettere il nome del dipartimento: “, nome_d); EXEC SQL SELECT Numero_d INTO :numero_d FROM Dipartimento WHERE Nome_d = :nome_d; EXEC SQL DECLARE Emp CURSOR FOR SELECT Ssn, Nome_batt, Iniz_int, Cognome, Stipendio FROM Impiegato WHERE N_d = :numero_d FOR UPDATE OF Stipendio; EXEC SQL OPEN Emp; EXEC SQL FETCH FROM Emp INTO :ssn, :nome_batt, :iniz_int, :cognome, :stipendio; while (SQLCODE == 0){ printf (“Il nome dell’impiegato è:”, nome_batt, iniz_int, cognome); prompt(“Immettere l’importo dell’aumento : “, aumento); EXEC SQL} F.Cesarini - Basi Dati Distribuite Appendice 16 8 Note all’esempio Il preprocessore introduce una struttura dati sqlca (SQL Communication Area) in cui ci sono dati di comunicazione fra il programma e il DBMS • – sqlca.code contiene il codice d’errore dell’ultimo comando SQL inviato al DBMS ( 0 = OK) exec sql begin/end declare section delimitano le variabili C da utilizzare come parametri per i comandi SQL (variabili host) Un cursore è uno strumento che permette di accedere alle righe di una tabella una alla volta • • – declare definisce un cursore associato ad una interrogazione – open manda in esecuzione la query e inizializza il cursore alla prima riga del risultato – fetch copia la riga puntata dal cursore nelle variabili e posiziona il cursore sulla riga successiva – close chiude il cursore, il risultato della query non è più necessario F.Cesarini - Basi Dati Distribuite Appendice 17 Remote Procedure Call (1) • Strumento per costruire software di tipo client/server usando una astrazione della tradizionale chiamata a procedura – Quando un client chiama una procedura remota, invia un messaggio di richiesta al server attraverso la rete – Dopo aver inviato la richiesta, il client si blocca in attesa della risposta – Quando il programma remoto (server) riceve una richiesta da un client, invoca la procedura specificata e manda il risultato indietro al client • Per implementare l’interazione è necessario del software apposito – Dalla parte del client gestisce l’invio del messaggio sulla rete e l’attesa della risposta – Dalla parte del server gestisce la ricezione del messaggio, il richiamo della procedura specificata e l’invio della risposta • Il software aggiuntivo è chiamato communication stub o proxy F.Cesarini - Basi Dati Distribuite Appendice 18 9 Remote Procedure Call (2) main prog main prog proc B client stub for B proc B single computer client server F.Cesarini - Basi Dati Distribuite server stub for B Appendice 19 Remote Procedure Call (3) • • Il programma usa le procedure call come se fossero locali Se viene fatta una call a una procedura che non è locale Il communication stub intercetta la procedure call Raccoglie i valori degli argomenti (operazione di “ marshaling”) Invia un messaggio al communication stub sul server Questi usa il tradizionale procedure call per attivare la procedura specifica e invia il risultato indietro al client stub – Quando il client stub riceve la risposta, la passa al suo chiamante esattamente come se fosse una procedura locale – – – – • • Le call dal main al client stub e dal server stub alla procedura usano la stessa interfaccia della call convenzionale del main alla procedura Ai client stub può essere dato lo stesso nome della procedura che rimpiazzano, così non viene cambiato il codice del programma originale F.Cesarini - Basi Dati Distribuite Appendice 20 10