Sei sulla pagina 1di 107

Definizione e interrogazione di basi di dati

SIMONA CAMARDA FABIO MAZZINI

no 2007

SQL
Il nome SQL un acronimo per Structured Query Language. un linguaggio utilizzato per la gestione dei database che assolve le funzioni di:
DDL (Data Definition Language ):

descrizione dei dati e delle strutture (definizione di domini, tabelle, indici, autorizzazioni, viste, vincoli, procedure, trigger) DML (Data Manipulation Language): manipolazione dei dati ed interrogazione

Transact-SQL (da qui in avanti, T-SQL) la versione di SQL utilizzata da Microsoft SQL Server. una versione proprietaria di SQL, di cui mantiene i costrutti base, ma fornisce funzionalit aggiuntive per la manipolazione e l'estrazione dei dati. Il T-SQL a tutti gli effetti un linguaggio di programmazione completo, che fornisce tutte le istruzioni e le 2 clausole per la definizione di variabili, flussi di controllo,

Parte prima SQL - DATA DEFINITION LANGUAGE

no 2007

DDL
Il Data Definition Language (DDL) contiene le parole chiavi e le istruzione necessarie per definire, modificare o eliminare tutti gli oggetti di un database: tabelle, viste procedure, funzioni, ruoli, privilegi Permette anche di definire degli indici (delle chiavi di ricerca), specificare dei collegamenti tra le tabelle ed imporre dei vincoli relazionale tra le tabelle del database. I comandi pi importanti sono:
CREATE ALTER DROP

Identificatori
Il nome completo di un oggetto composto da 4 identificatori: [ [ [ server. ] [ database ] . ] [ schema ] . ] oggetto Quando si fa riferimento a un oggetto, non sempre necessario specificare i qualificatori server, database e proprietario. In tal caso verranno considerati server e database correnti. Se non specificato il qualificatore dello schema, il motore assume che stiamo lavorando sullo schema di default dbo.

CREATE
Tramite la parola chiave CREATE possibile definire qualunque nuova entit all'interno del database. La clausola CREATE seguita dalla tipologia di oggetto che vogliamo definire (TABLE, VIEW, INDEX) e dal nome che intendiamo assegnargli:
CREATE [ TABLE | VIEW | FUNCTION | ] entit

Le entit di uso pi comune che possibile creare sono, ad esempio:


Tabelle: CREATE TABLE tabella Viste: CREATE VIEW vista AS Indici: CREATE [ CLUSTERD | NONCLUSTERED ] INDEX indice

ON Funzioni: CREATE FUNCTION funzione Procedure: CREATE PROCEDURE procedura

ALTER
La parola chiave ALTER permette di modificare una qualsiasi entit del database. Ha la stessa sintassi di CREATE:
ALTER [TABLE | VIEW | FUNCTION | ] entit

Per quanto riguarda le tabelle, ad esempio, tramite ALTER possibile aggiungere o rimuovere colonne, ridefinire le colonne esistenti, creare o modificare i vincoli relazionali e cos via.

DROP
La parola chiave DROP permette di eliminare qualunque entit del database, compreso il database stesso. Si tratta dunque di un'istruzione da utilizzare con una certa cautela La sintassi la stessa di CREATE e ALTER:
DROP [TABLE | VIEW | FUNCTION | ] entit

NOTA BENE: L'istruzione di DROP, cos come tutte le istruzioni di tipo DDL, non transazionale: questo significa che una volta eseguita non possibile tornare indietro!

CREATE TABLE (1)


Tramite l'istruzione CREATE TABLE possibile definire la struttura di una nuova tabella e crearne un'istanza vuota. Si tratta di un'istruzione con una sintassi estremamente complessa, in quanto permette, nello stesso momento di definire:
le colonne della tabella: nome, tipo dato, lunghezza, valori di

default, vincoli... la chiave primaria, se presente i vincoli relazionali (chiavi esterne) il filegroup sul quale risieder la tabella lo schema di appartenenza

E molto altro ancora.

CREATE TABLE (2)


Sintassi di esempio per la creazione di una semplice tabella con 3 colonne, una chiave primaria e la definizione di un vincolo di integrit referenziale (chiave esterna) verso una seconda tabella:
CREATE TABLE Tabella ( Colonna1 int NOT NULL, Colonna2 varchar (100) NULL, Colonna3 char (3) NULL, CONSTRAINT PK_Tabella PRIMARY KEY CLUSTERED ( Colonna1 ASC ), CONSTRAINT FT_Tabella_AltraTabella FOREIGN KEY (Colonna3) REFERENCES AltraTabella (AltraColonna) ) ON [PRIMARY]
10

Tipi dati T-Sql (1)


Formati numerici esatti
bigint

da -2^63 (-9,223,372,036,854,775,808) a 2^63-1 (9,223,372,036,854,775,807) int da -2^31 (-2,147,483,648) a 2^31-1 (2,147,483,647) smallint da -2^15 (-32,768) a 2^15-1 (32,767) tinyint da 0 a 255 bit 0/1, TRUE/FALSE decimal(p,s) p (precisione), numero massimo di cifre, sia intere che decimali, 1 <= p <= 18 (default 18)

s (scala) , numero massimo di cifre decimali, 0 <= s <= p


numeric(p,s)

equivalente a decimal money Da -922.337.203.685.477,5808 a 922.337.203.685.477,5807 smallmoney Da -214.748,3648 a 214.748,3647


11

Tipi dati T-Sql (2)


Formati numerici approssimati a virgola mobile
float(n)

Da - 1,79E+308 a -2,23E-308, 0 e da 2,23E-308 a

1,79E+308

1 <= n <= 53 (default 53)


real

Da - 3,40E + 38 a -1,18E - 38, 0 e da 1,18E - 38 a

3,40E + 38

equivalente a float(24) Formati di data e ora


datetime

dal 1 gennaio 1753 al 31 dicembre 9999 (accuratezza 3,33 millisecondi) smalldatetime dal 1 gennaio 1900 al 6 giugno 2079 (accuratezza 1 minuto)
12

Tipi dati T-Sql (3)


Formati di testo
char(n)

stringhe non-unicode a lunghezza fissa con lunghezza di n byte, dove n rappresenta un valore compreso tra 1 e 8.000 (default 1) varchar(n|max) stringhe non-unicode a lunghezza variabile con lunghezza di n byte, 1 <= n <= 8.000 (default 1) max = 2^311 byte (2.147.483.647 caratteri) text stringhe non-unicode a lunghezza variabile con lunghezza massima di 2^31-1 byte (2.147.483.647 caratteri) nchar(n) stringhe unicode a lunghezza fissa con lunghezza di n byte, dove n rappresenta un valore compreso tra 1 e 4.000 (default 1) nvarchar(n|max) stringhe unicode a lunghezza variabile con lunghezza di n byte, 1 <= n <= 4.000 (default 1) max = 2^301 byte (1.073.741.823 caratteri) 13

Tipi dati T-Sql (4)


Formati di testo
binary(n) dati binari a lunghezza fissa con lunghezza di n byte,

dove n rappresenta un valore compreso tra 1 e 8.000 varbinary(n|max) dati binari a lunghezza variabile con lunghezza di n byte, 1 <= n <= 8.000

max = 2^31-1 byte


image

dati binari a lunghezza variabile da 0 a 2^31-1 byte

Formato table l formato table un tipo di dati speciale utilizzabile per archiviare un set di risultati per l'elaborazione successiva. Viene utilizzato principalmente come spazio di archiviazione temporanea di un set di righe restituito, ad esempio come set di risultati di una funzione valutata a livello di tabella. La loro definizione in tutto e per tutto simile alla definizione di una tabella: 14 DECLARE @tabella TABLE (campo varchar(10))

Vincoli intrarelazionali
I vincoli intrarelazionali sono vincoli che interessano una sola tabella. Si possono suddividere in tre tipologie:
Vincoli di definizione (o di cella) - il valore contenuto in una

cella dipende unicamente dalla sua definizione:

Tipo dato: definisce se il contenuto della colonna sar numerico, alfanumerico, ecc. Null / not null: specifica se la colonna accetta / non accetta valori NULL

Vincoli di colonna il valore di una cella dipende dalla sua

definizione e dal contenuto delle altre celle della medesima colonna:

Identity: il valore della colonna viene assegnato in modo automatico e univoco Primary key: identifica la colonna (o il set di colonne) contenente valori che identificano in modo univoco una riga in una tabella Unique: garantisce l'univocit dei valori in una colonna Check:(sulla colonna): assicura l'integrit di dominio limitando i valori accettati da una colonna

Vincoli di riga il valore di una cella dipende dalla sua

definizione e dal contenuto delle altre celle della medesima riga:

Check (sulla riga)

15

Vincoli interrelazionali
Sono vincoli che definiscono legami tra due o pi tabelle:
FOREIGN KEY:

Il vincolo interrelazionale pi utilizzato quello di integrit referenziale: gli attributi di una data tabella possono assumere soltanto dei valori specificati in un'altra tabella, ossia definiscono il cosiddetto dominio dei dati.

16

PRIMARY KEY
Identifica la colonna o il set di colonne contenente valori che identificano in modo univoco una riga in una tabella. Si pu utilizzare una sola volta per ogni tabella. Tutte le colonne definite in un vincolo PRIMARY KEY devono essere definite come NOT NULL. Pu essere dichiarata
in fase di creazione della tabella, nella definizione dell'attributo,

ad esempio: Matricola varchar(6) PRIMARY KEY oppure successivamente tramite una clausola di ALTER TABLE, ad esempio:

ALTER TABLE nometabella ADD CONSTRAINT nomePrimaryKey PRIMARY KEY (campo1 [ASC | DESC], campo2 [ASC | DESC], ) ON [PRIMARY]

17

Altri vincoli
CHECK condizione Assicura l'integrit di dominio tramite la limitazione dei valori che possibile inserire in una colonna DEFAULT valore Indica il valore che deve assumere l'attributo quando viene inserita una riga nella tabella senza che sia specificato un valore per l'attributo stesso. Se non specificato, il valore di default NULL . IDENTITY(inizio, incremento) Indica che l'attributo un contatore che verr incremetato automaticamente ad ogni inserimento nella tabella. Bisogna specificare il numero da cui partire e l'unit di incremento per ogni successivo inserimento - di solito, IDENTITY(1, 1).

18

Viste
Una vista una tabella virtuale il cui contenuto definito da una query. In modo analogo a una tabella, una vista costituita da un set di colonne e righe di dati denominate. Tuttavia, una vista non esiste come set archiviato di valori di dati in un database. Le righe e le colonne di dati provengono da tabelle a cui fa riferimento la query che definisce la vista e sono prodotte dinamicamente quando, in una qualunque istruzione di SELECT, INSERT, ecc., si fa riferimento alla vista stessa. La sintassi per la creazione di una vista la seguente: CREATE VIEW nome_vista AS SELECT

19

Indici (1)
Gli indici consentono di accedere in modo rapido a informazioni specifiche di una tabella di database. L'indice fornisce dei puntatori ai valori dei dati memorizzati in determinate colonne della tabella disponendoli in base al criterio di ordinamento impostato . Come regola generale, necessario creare un indice in una tabella solo se vengono eseguite query frequenti sui dati di colonne indicizzate. Gli indici occupano spazio su disco e rallentano le operazioni di aggiunta, eliminazione e aggiornamento di righe. In SQL Server vengono creati automaticamente indici univoci per imporre i requisiti di univocit dei vincoli PRIMARY KEY e UNIQUE. La sintassi per la creazione di un indice la seguente:
CREATE [ CLUSTERD | NONCLUSTERED ] INDEX indice ON tabella ( colonna1 [ ASC | DESC ], colonna2 [ ASC | DESC ], 20

Indici (2)
Nella creazione degli indici importante avere chiara la differenza fra indici di tipo CLUSTERED e indici di tipo NONCLUSTERED:
CLUSTERED: Crea un indice in cui l'ordine logico dei valori di

chiave determina l'ordine fisico delle righe corrispondenti di una tabella. Il livello inferiore, o foglia, dell'indice cluster contiene le righe di dati effettive della tabella. possibile creare un solo indice cluster alla volta per una tabella o una vista.
NONCLUSTERED: Crea un indice che specifica l'ordinamento

logico di una tabella. Quando si utilizza un indice non cluster, l'ordine fisico delle righe di dati indipendente dall'ordine delle righe indicizzato. Per ogni tabella possibile definire al massimo 999 indici non cluster, indipendentemente dal fatto che vengano creati in modo implicito tramite vincoli PRIMARY KEY e UNIQUE oppure in modo esplicito tramite CREATE INDEX.
21

LINKED SERVER
possibile effettuare query su altri server collegati (linked server). Esistono due modi per accedere ai dati di un linked server: usando gli identificatori: SELECT * FROM NomeLinkedServer.NomeDb.NomeOwner.NomeTabella oppure con la clausola OPENQUERY: SELECT * FROM OPENQUERY (NomeLinkedServer, 'query') in questo caso la query viene eseguita nel database remoto.
22

Parte seconda SQL - DATA MANIPULATION LANGUAGE

no 2007

DML
La parte di SQL denominata Data Manipulation Language (DML) definisce i comandi per accedere ai dati delle tabelle del database. Tali comandi permettono dunque di eseguire delle interrogazioni (query) sulle tabelle, ma anche di inserire, modificare o cancellare i dati. I comandi fondamentali sono:
SELECT INSERT UPDATE DELETE

Ne esistono poi altri di uso meno comune ma comodi in situazioni specifiche, ad esempio:
TRUNCATE
24

SELECT (1)
Recupera righe dal database e consente la selezione di una o pi espressioni da una o pi tabelle o viste.
SELECT [ ALL | DISTINCT ] [ TOP n [ PERCENT ] ] [lista espressioni

|*] [ INTO nuova tabella ] FROM lista tabelle [ WHERE condizioni semplici ] [ GROUP BY lista attributi di raggruppamento [ HAVING condizioni aggregate ]

] [ ORDER BY lista attributi di ordinamento [ ASC | DESC ] ] Un'espressione una combinazione di simboli e operatori che vengono valutati in modo da restituire un singolo valore. Le espressioni semplici possono essere costituite da un'unica costante, variabile, colonna o funzione scalare. possibile utilizzare gli operatori per unire due o pi espressioni semplici25

SELECT (2)
possibile specificare alcune clausole che agiscono sul numero di righe estratto dalla query:
ALL

Specifica che nel set di risultati possono essere visualizzate righe duplicate. Il valore predefinito ALL. DISTINCT Specifica che nel set di risultati devono essere visualizzate solo righe univoche. I valori NULL vengono considerati valori uguali. TOP n [PERCENT] Specifica che dal set di risultati devono essere incluse nell'output solo le prime n righe. Se si specifica PERCENT, nell'output viene incluso solo il numero di righe corrispondente al primo n percento.

26

SELECT (3)
Tramite l'istruzione SELECT possibile indicare le colonne del set di dati che andranno a costituire il risultato della nostra interrogazione. Tali dati possono essere di varie tipologie:
colonne delle tabelle indicate dalla clausola FROM espressioni calcolate a partire da una o pi colonne costanti risultati di funzioni

Per ognuna delle colonne possibile definire un alias tramite la clausola AS, ad esempio:
SELECT colonna1, --estrazione di una colonna singola

colonna2 + colonna3 AS somma, --colonna calcolata come somma 'ciao mondo!' AS saluto, --costante (tutte le righe avranno lo stesso valore), LTRIM(RTRIM(colonna3)) --risultato di una funzione
27

Operatori aritmetici
Gli operatori aritmetici eseguono operazioni matematiche su due espressioni di uno o pi tipi di dati appartenenti alla categoria dei tipi di dati numerici: + (addizione) - (sottrazione) * (moltiplicazione) / (divisione) % (modulo): restituisce il resto di una divisione, ad esempio:
SELECT 23 % 5 restituisce 3

Il segno pi (+) inoltre l'operatore che consente di concatenare pi stringhe fra loro, ad esempio: SELECT 'Ciao' + ' ' + 'Mondo!' restituisce la stringa 'Ciao Mondo!'
28

INTO
Sintassi:
SELECT lista attributi o espressioni

INTO nuova tabella FROM lista tabelle Lo statement esegue l'istruzione SELECT e inserisce i dati estratti in una nuova tabella, dopo averla opportunamente creata con la stessa formattazione dei campi estratti.

29

FROM
La clausola FROM specifica la tabella, o l'insieme di tabelle, da cui recuperare i dati, ossia definisce il set complessivo di colonne che sar possibile selezionare, o comunque utilizzare, nella clausola SELECT. La clausola FROM obbligatoria. Contiene le condizioni di join. Esempio di estrazione da una tabella singola:
SELECT lista attributi o espressioni

FROM tabella Esempio di estrazione da due tabelle in join:


SELECT lista attributi o espressioni

FROM tabella1 INNER JOIN tabella2 ON tabella1.colonna = tabella2.colonna

30

JOIN
Consentono di mettere in relazione due o pi tabelle fra loro. Esistono varie tipologie di join che restituiscono insiemi pi o meno ampi di risultati: CROSS JOIN INNER JOIN LEFT OUTER JOIN RIGTH OUTER JOIN FULL OUTER JOIN

31

CROSS JOIN
Consente di ottenere il prodotto cartesiano delle tabelle specificate nella join. Ogni riga della prima tabella viene combinata con tutte le righe della seconda. Esistono due sintassi alternative. Quella pi corretta: SELECT T1.*, T2.* FROM Tabella1 as T1 CROSS JOIN Tabella2 as T2 E quella pi tradizionale: SELECT T1.*, T2.* FROM Tabella1 as T1, Tabella2 as T2
32

INNER JOIN (1)


un tipo di join in cui le righe delle tabelle vengono combinate solo se i campi collegati con join soddisfano una determinata condizione. Sintassi: SELECT * FROM Tabella1 as T1 INNER JOINTabella2 as T2 ON T1.campo = T2.campo La condizione di join pu essere di qualunque tipo, su un qualunque numero di colonne, ad esempio:
T1.campo > T2.campo T1.campo BETWEEN T2.campo1 AND T2.campo2 T1.campo <> T2.campo (equivalente a: NOT T1.campo =

T2.campo)
33

INNER JOIN (2)


Se nella stessa istruzione sono inclusi operatori di join che consentono di unire pi coppie di colonne, le espressioni di join possono essere concatenate tramite gli operatori logici AND e OR e gli opportuni raggruppamenti delimitati dalle parentesi tonde, ad esempio: SELECT * FROM Tabella1 as T1 INNER JOINTabella2 as T2 ON T1.campo = T2.campo AND (T1.campo2 > T2.campo2 OR T1.campo3 < T2.campo3) Anche per la INNER JOIN esiste una sintassi tradizionale alternativa: SELECT * FROM Tabella1 as T1, Tabella2 as T2

34

SELF JOIN
possibile mettere in relazione una tabella con se stessa. In tal caso si parla di SELF JOIN. Poich tale tipo di query comporta l'esecuzione di un join di una tabella con se stessa, tale tabella svolge due ruoli, che quindi devono essere distinti assegnando due alias diversi nella clausola FROM. I due alias vengono utilizzati per qualificare i nomi delle colonne nella parte rimanente della query, ad esempio: SELECT T1.*, T2.* FROM Tabella1 AS T1 INNER JOINTabella1 AS T2 ON T1.campo = T2.campo

35

LEFT OUTER JOIN


Permette di relazionare due tabelle tra di loro recuperando l'intero set di valori della tabella posta a sinistra nella relazione. Qualora non esistano valori corrispondenti nella tabella a destra, essi verranno sostituiti con dei NULL. Sintassi: SELECT campi FROM prima_tabella LEFT OUTER JOINseconda_tabella ON prima_tabella.campo = seconda_tabella.campo

36

RIGHT OUTER JOIN


Permette di relazionare due tabelle tra di loro recuperando l'intero set di valori della tabella posta a destra nella relazione. Qualora non esistano valori corrispondenti nella tabella a sinistra, essi verranno sostituiti con dei NULL. Sintassi: SELECT campi FROM prima_tabella RIGHT OUTER JOINseconda_tabella ON prima_tabella.campo = seconda_tabella.campo

37

FULL OUTER JOIN


Permette di relazionare due tabelle tra di loro recuperando l'intero set di valori sia della tabella posta a sinistra nella relazione sia della tabella posta a destra. Qualora non esistano valori corrispondenti in una delle due tabelle, essi verranno sostituiti con dei NULL. Sintassi: SELECT * FROM Tabella1 FULL OUTER JOINTabella2 ON Tabella1.campo = Tabella2.campo equivalente a una LEFT OUTER JOIN in UNION con una RIGHT OUTER JOIN.

38

OUTER APPLY / CROSS APPLY


L'operatore APPLY consente di richiamare una funzione valutata a livello di tabella per ogni riga restituita da un'espressione di tabella esterna di una query. La funzione valutata a livello di tabella opera come input destro, mentre l'espressione di tabella esterna opera come input sinistro. L'input destro viene valutato per ogni riga dell'input sinistro e le righe prodotte vengono combinate per l'output finale. L'elenco di colonne prodotto dall'operatore APPLY corrisponde al set di colonne nell'input sinistro seguito dall'elenco di colonne restituito dall'input destro. Si utilizza frequentemente con le funzioni che restituiscono una tabella, ad esempio: SELECT T.colonna1, T.colonna2, F.risultato FROM tabella1 T OUTER APPLYfunzione(T.colonna1, T.colonna2) AS F L'operatore CROSS APPLY restituisce solo le righe della tabella esterna che producono un set di risultati, mentre l'operatore OUTER APPLY restituisce sia le righe che producono un set di 39

Join fra pi di due tabelle


Ogni join consente di unire solo due tabelle. Tuttavia, dato che le clausole FROM possono includere pi definizioni di JOIN, possibile unire in JOIN anche con tipologie di JOIN differenti numerose tabelle utilizzando la stessa query. Ad esempio: SELECT * FROM Tabella1 INNER JOINTabella2 ON Tabella1.campo = Tabella2.campo1 LEFT OUTER JOIN Tabella3 ON Tabella2.campo2 = Tabella3.campo

40

WHERE
Tramite la clausola WHERE possibile specificare le condizioni per le righe restituite nel set dei risultati di un'istruzione SELECT, per le righe da aggiornare in un'istruzione UPDATE e quelle da cancellare in un'istruzione DELETE. Non sono previsti limiti per il numero di condizioni che possibile includere. Tali condizioni sono collegate fra loro tramite gli operatori logici AND, OR, NOT.
AND: Restituisce TRUE se entrambe le condizioni sono TRUE OR: Restituisce TRUE se almeno una delle due condizioni TRUE NOT: Inverte il valore della precedente condizione.

NOT l'operatore con precedenza massima, seguito da AND e da OR. Tramite le parentesi tonde comunque possibile raggruppare i predicati per ottenere l'ordine di precedenza richiesto.

41

Operatori di confronto
Gli operatori di confronto consentono di confrontare due espressioni, restituendo un valore di tipo booleano: TRUE se il confronto verificato, FALSE altrimenti. In T-SQL sono possibile utilizzare i seguenti operatori di confronto:
= uguale a <> / != diverso da > maggiore di < minore di >= maggiore o uguale a <= minore o uguale a !< non minore di equivalente a >= !> non maggiore di equivalente a <=

42

Operatori logici (1)


Gli operatori logici verificano la veridicit di una determinata condizione. Analogamente agli operatori di confronto, gli operatori logici restituiscono un boolean con valore TRUE o FALSE: BETWEEN / NOT BETWEEN: Restituisce TRUE se l'operando compreso (non compreso) nell'intervallo specificato IS NULL / IS NOT NULL : Restituisce TRUE se l'espressione (non ) nulla

43

Operatori logici (2)


LIKE / NOT LIKE: Restituisce TRUE se l'operando corrisponde a un modello. La sintassi la seguente: espressione [ NOT ] LIKE pattern [ESCAPE carattere] dove pattern specifica la stringa di caratteri da cercare e pu includere i seguenti caratteri jolly validi:
%: stringa composta da zero o pi caratteri _: carattere singolo [x-y], [xyz]: carattere singolo compreso nell'intervallo ([x-y]) o

nel set ([xyz]) specificato [^x-y], [^xyz]: carattere singolo NON compreso nell'intervallo ([x-y]) o nel set ([xyz]) specificato

mentre con ESCAPE carattere (opzionale) possibile indicare un carattere che, posto davanti a un carattere jolly, indica che il carattere jolly deve essere interpretato come carattere normale, ad esempio: WHERE colonna LIKE '%sconto 10!%%' ESCAPE '!' cerca tutti le righe in cui colonna contiene l'espressione 44

Operatori logici (3)


IN / NOT IN: Determina se il valore specificato corrisponde a un valore in una subquery o in un elenco, ad esempio: WHERE colonna IN (1,2,3) WHERE colonna NOT IN (SELECT colonna FROM tabella) EXISTS / NOT EXISTS: Restituisce TRUE se una subquery include una o pi righe, ad esempio: SELECT * FROM Tabella1 WHERE EXISTS (SELECT * FROM Tabella2 WHERE Tabella2.campo = Tabella1.campo)
45

Operatori logici (4)


ALL: restituisce TRUE se tutti i confronti specificati sono TRUE SOME (o la clausola equivalente ANY): restituisce TRUE se almeno uno dei confronti specificati TRUE Ad esempio, se abbiamo una subquery che restituisce i valori 2 e 3, avremo:

2 <= ALL (subquery) => TRUE (2 minore o uguale sia di 2 che di 3) 2 = ALL (subquery) => FALSE (2 uguale a 2 ma diverso da 3) 2 < SOME (subquery) => TRUE (2 almeno minore di 3) 4 < SOME (subquery) => FALSE (4 non minore n di 2 n di 3)

46

CONTAINS e la ricerca FULL-TEXT (1)


La ricerca full-text consente l'indicizzazione rapida e flessibile per query basate su parole chiave dei dati di testo archiviati in un database di MicrosoftSQL Server. A differenza del predicato LIKE, che supporta solo i modelli di caratteri, le query full-text eseguono ricerche linguistiche su tali dati, operando su parole e frasi in base alle regole di una lingua specifica. L'utilizzo di tale funzionalit richiede la definizione di una nuova entit di database, il catalogo full-text, e di uno o pi indici full-text sulle tabelle sulle quali dovr essere possibili la ricerca testuale. Ogni tabella pu contenere un unico indice full-text. A livello di query, la ricerca testuale avviene attraverso l'utilizzo della clausola CONTAINS. Senza andare nel dettaglio - la clausola permette ricerche estremamente complesse e articolate - riportiamo alcuni esempi sul suo funzionamento ipotizzando di ricercare dei

47

CONTAINS e la ricerca FULL-TEXT (2)


WHERE CONTAINS(Trama, 'figlio', LANGUAGE 'italian')

identifica tutte le trame che contengono la parola "figlio"


WHERE CONTAINS(Trama, ' "figl*" AND "ospedale" ', LANGUAGE

'italian')

identifica tutte le trame che contengono la parola "ospedale" e delle parole che iniziano per "figl" (figlio, figlia, ecc.)
WHERE CONTAINS(Trama, ' FORMSOF(INFLECTIONAL, figlio) ',

LANGUAGE 'italian')

identifica tutte le trame che abbiano una qualche forma della parola "figlio"
WHERE CONTAINS(Trama, ' FORMSOF(THESAURUS, amore) ',

LANGUAGE 'italian')

identifica tutte le trame che contengano qualche parola correlate alla parola "amore"
WHERE CONTAINS(Trama, ' "figli*" NEAR incidente ', LANGUAGE

'italian')

identifica tutte le trame che contengano una parola che 48

GROUP BY
Specifica i gruppi su cui calcolare un valore aggregato quando l'elenco di selezione della clausola SELECT include funzioni di aggregazione. Quando si specifica GROUP BY, necessario che l'elenco GROUP BY includa tutte le colonne di un'espressione non di aggregazione dell'elenco di selezione oppure che l'espressione GROUP BY corrisponda esattamente all'espressione dell'elenco di selezione.

49

HAVING
Specifica una condizione di ricerca per un gruppo o una funzione di aggregazione. La clausola HAVING utilizzata in combinazione con la clausola GROUP BY.

50

ORDER BY (1)
Serve ad ordinare il risultato di una query in base determinati campi : possibile specificare il nome della colonna, il suo alias o un valore intero che rappresenta la posizione della colonna nell'elenco di selezione.
SELECT Colonna1 FROM Tabella1 ORDER BY Colonna1 SELECT Colonna1 as X FROM Tabella1 ORDER BY X SELECT Colonna1 FROM Tabella1 ORDER BY 1

L'opzione DESC ordina i risultati in modo decrescente, ASC in modo crescente. Se non specificato, il default ASC. Nota bene: i valori nulli sono considerati i pi piccoli in assoluto.

51

ORDER BY (2)
La clausola ORDER BY pu includere elementi non inclusi nell'elenco di selezioni a meno che non sia stata specificata la clausola DISTINCT, oppure nella query sia presente un operatore di GROUP BY o di UNION. Ad esempio, corretto scrivere: SELECT Colonna1 FROM Tabella1 ORDER BY Colonna2 Mentre la query seguente non valida: SELECT Colonna1 FROM Tabella1 UNION SELECT ColonnaA FROM Tabella ORDER BY Colonna2

52

UNION / UNION ALL


Combina i risultati di due o pi query in un singolo set di risultati che include tutte le righe delle query combinate. Tutte le query devono includere lo stesso numero di colonne nello stesso ordine. I tipi di dati devono essere compatibili. Se si specifica la condizione ALL, il set di risultati comprender anche le righe duplicate. Se viene omesso, esse vengono rimosse. Sintassi: SELECT * FROM Tabella1 UNION [ALL] SELECT * FROM Tabella1

53

INTERSECT / EXCEPT
I due operatori restituiscono i valori distinti eseguendo un confronto dei risultati di due query. Si differenziano in quanto:
EXCEPT restituisce tutti i valori distinti della query a sinistra

dell'operando non presenti nella query a destra; INTERSECT restituisce tutti i valori distinti restituiti da entrambe le query a sinistra e a destra dell'operando.

Tutte le query devono includere lo stesso numero di colonne nello stesso ordine. I tipi di dati devono essere compatibili. Sintassi: SELECT Colonna1, Colonna2 FROM Tabella1 INTERSECT SELECT ColonnaA, ColonnaB FROM Tabella1

54

Funzioni predefinite
In T-SQL sono incluse numerose funzioni predefinite che possono essere utilizzate per l'elaborazione di colonne e espressioni. La sintassi per l'utilizzo delle funzioni la seguente: SELECT function_name ( param1, param2, , paramN ) Esistono sia funzioni scalari, che restituiscono un unico valore, sia funzioni di tabella che restituiscono l'equivalente di una tabella. Le funzioni scalari possono a loro volta essere suddivise, a seconda del tipo dati che trattano, in funzioni di testo, funzioni matematiche e funzioni di data e ora. Di seguito vediamo alcuni esempi delle funzioni principali per 55 ognuna di tali tipologie.

Funzioni di testo (1)


CHARINDEX ( stringa_da_cercare , testo [ , posizione_da_cui_iniziare ] ) Restituisce il punto iniziale dell'espressione specificata in una stringa di caratteri, a partire eventualmente dalla posizione indicata, oppure zero se il non viene trovata PATINDEX ( '%pattern%' , testo ) Restituisce la posizione di inizio della prima occorrenza di un criterio di ricerca (si possono usare i caratteri jolly), oppure zero. REPLACE ( testo, stringa_da_cercare , stringa_di_sostituzione ) Sostituisce tutte le occorrenze di un valore stringa specificato con un altro valore stringa. LEFT ( testo , numero_di_caratteri ) / RIGHT ( testo , numero_di_caratteri ) Restituisce la parte iniziale (LEFT) o finale (RIGHT) di

56

Funzioni di testo (2)


SUBSTRING ( testo , posizione_da_cui_iniziare , numero_di_caratteri ) Restituisce la parte di un testo a partire dalla posizione (1 per la prima posizione) e per il numero di caratteri indicati. LEN (testo ) Restituisce il numero di caratteri dell'espressione specificata, esclusi gli spazi vuoti finali. LOWER (testo ) / UPPER (testo ) Convertono il testo in minuscolo (LOWER) o in maiuscolo (UPPER) LTRIM (testo ) / RTRIM (testo ) Rimuovono gli spazi iniziali (LTRIM) o finali da un testo

57

Funzioni matematiche (1)


ABS ( numero ) Funzione matematica che restituisce il valore assoluto (positivo) dell'espressione numerica specificata. ROUND ( numero , cifre_decimali ) Restituisce un valore numerico arrotondato alla lunghezza o alla precisione specificata. FLOOR ( numero ) Restituisce il valore integer maggiore che risulta minore o uguale all'espressione numerica specificata. CEILING ( numero ) Restituisce il pi piccolo valore integer maggiore o uguale all'espressione numerica specificata.

58

Funzioni matematiche (2)


SIGN ( numero ) Restituisce il segno positivo (+1), zero (0) o il segno negativo (-1) dell'espressione specificata. SQRT ( numero ) Restituisce la radice quadrata del valore specificato. SQUARE ( numero ) Restituisce il quadrato del valore specificato. POWER ( numero , potenza ) Restituisce il valore dell'espressione specificata elevato alla potenza indicata.

59

Funzioni di data e ora (1)


GETDATE () Restituisce la data corrente. DATEADD ( tipo , intervallo , data ) Restituisce un nuovo valore basato sull'aggiunta di un intervallo alla data specificata: parte un parametro che consente di specificare di il significato del parametro intervallo: year, month, day Ad esempio: DATEADD(month, 1, '01/01/2010') restituisce '01/02/2010' DATEDIFF ( tipo , data_iniziale , data_finale ) Restituisce la differenza di due date secondo il tipo di intervallo specificato: mesi, giorni, anni, ecc.
60

Funzioni di data e ora (2)


DATEPART (tipo , data ) Restituisce la parte della data indicata dal parametro tipo. YEAR ( data ) / MONTH ( data ) / DAY ( data ) Restituiscono rispettivamente l'anno, il mese e il giorno di una data. Equivalenti a DATEPART(year, data), DATEPART(month, data), DATEPART(day, data)

61

ALTRE FUNZIONI (1)


ISNUMERIC ( espressione ) Restituisce 1 se l'espressione un tipo numerico valido, 0 altrimenti. ISDATE ( espressione ) Restituisce 1 se l'espressione un tipo data valido, 0 altrimenti. ISNULL ( espressione , espressione_sostituto ) Se espressione NULL restituisce espressione_sostituto, altrimenti restituisce

espressione.

NULLIF ( espressione , espressione_confronto ) Se espressione uguale a espressione_confronto restituisce NULL, altrimenti restituisce espressione.
62

Altre funzioni (2)


COALESCE ( espressione_1, espressione_2 , , espressione_n ) Restitusce la prima espressione non nulla fra i suoi argomenti. CAST ( espressione AS tipo_di_dato [ ( lunghezza) ] ) CONVERT ( tipo_di_dato [ ( lunghezza) ] , espressione [ , stile ] ) Convertono il tipo di dati di espressione in un altro tipo di dati - della lunghezza indicata, per tipo che permettono di specificarla stile una costante che indica il formato di input o di output per i tipi data e numerici. Ad esempio, 112 indica il formato aaaammgg, 110 il formato americano mmgg-aaaa e cos via. Ad esempio:

CONVERT ( varchar, GETDATE() , 101 ) restituisce la data attuale

63

Funzione CASE (1)


La funzione CASE valuta un elenco di condizioni e restituisce una delle espressioni di risultato possibili. La funzione CASE ha due formati:
Semplice: esegue un confronto tra un'espressione e un set di

espressioni semplici per determinare il risultato. Avanzata: valuta un set di espressioni booleane per determinare il risultato.

Entrambi i formati supportano un argomento facoltativo ELSE. possibile utilizzare CASE in tutti i casi in cui consentita un'espressione valida, ad esempio, nelle espressioni quali SELECT, UPDATE, DELETE e SET e nelle clausole quali IN, WHERE, ORDER BY e HAVING.
64

Funzione CASE (2)


Funzione CASE semplice: CASE espressione_input WHEN espressione_when_1 THEN espressione_risultato_1 WHEN espressione_when_2 THEN espressione_risultato_2 ELSE espressione_risultato_default END Funzione CASE avanzata: CASE WHEN espressione_booleana_1 THEN espressione_risultato_1 WHEN espressione_booleana_2 THEN espressione_risultato_2

65

Funzioni di aggregazione
Le funzioni di aggregazione eseguono un calcolo su un set di valori e restituiscono un valore singolo. Ad eccezione della funzione COUNT, le funzioni di aggregazione ignorano i valori Null. Vengono spesso utilizzate con la clausola GROUP BY dell'istruzione SELECT. Le funzioni principali sono:
COUNT( expression a ) Restituisce il numero di righe (escludendo

quelle con valore NULL) di una colonna COUNT( * ) Restituisce il numero di righe selezionate COUNT( DISTINCT expression a ) Restituisce il numero di righe diverse selezionate AVG( expression ) Restituisce il valore medio di una colonna MAX( expression ) Il valore massimo in una colonna MIN( expression ) Il valore minimo SUM( expression ) La somma dei valori di una colonna

66

COUNT / COUNT_BIG
COUNT ( * | [ ALL | DISTINCT ] expression ) Restituisce il numero di elementi in un gruppo. Il funzionamento di COUNT_BIG analogo a quello della funzione COUNT. L'unica differenza il valore restituito. COUNT_BIG infatti restituisce sempre un valore di tipo bigint mentre COUNT restituisce sempre un valore di tipo int. Pu precedere la clausola OVER.
*

Conta le righe restituite dalla query ALL Applica la funzione di aggregazione a tutti i valori. il valore predefinito. DISTINCT Indica che la funzione AVG deve essere eseguita solo in ogni istanza univoca di un valore, indipendentemente dal numero di occorrenze del valore. expression Colonna o espressione sulla quale deve essere 67 eseguito il conteggio.

AVG
AVG ( [ ALL | DISTINCT ] expression ) Restituisce la media dei valori di un gruppo. I valori Null vengono ignorati. Pu precedere la clausola OVER.
ALL

Applica la funzione di aggregazione a tutti i valori. DISTINCT Indica che la funzione AVG deve essere eseguita solo in ogni istanza univoca di un valore, indipendentemente dal numero di occorrenze del valore. expression Colonna o espressione sulla quale deve essere eseguito il calcolo.

68

MIN / MAX
MIN (expression) / MAX (expression) Restituiscono rispettivamente il valore minimo e il valore massimo dell'espressione. Pu precedere la clausola OVER.
expression

Colonna o espressione sulla quale deve essere

eseguito il calcolo.

Le funzioni MIN e MAX ignorano i valori Null. Con colonne di dati di tipo carattere, MIN e MAX consentono di individuare il valore minore o, rispettivamente maggiore, rispetto alla sequenza di confronto.

69

SUM
SUM ( [ ALL | DISTINCT ] expression ) Restituisce la somma di tutti i valori o solo dei valori DISTINCT dell'espressione. La funzione SUM pu essere utilizzata solo con colonne numeriche. I valori Null vengono ignorati. Pu precedere la clausola OVER.
ALL

Applica la funzione di aggregazione a tutti i valori. il valore predefinito. DISTINCT Indica che la funzione SUM deve essere eseguita solo in ogni istanza univoca di un valore, indipendentemente dal numero di occorrenze del valore. expression Colonna o espressione sulla quale deve essere eseguito il calcolo.

70

Clausola OVER
aggregate functions OVER (PARTITION BY expression) ranking functions OVER ( [ PARTITION BY expression, ] ORDER BY expression ) La clausola OVER determina il partizionamento e l'ordinamento del set di righe prima dell'applicazione della funzione finestra associata. Con funzione finestra si intende una funzione che lavora su un set di righe definite, detto finestra, e calcola un valore per ognuna di tali righe. Ne esistono due tipologie: funzioni di aggregazione (le stesse che si usano con la clausola GROUP BY) e funzioni di rango.
PARTITION BY Suddivide il set di risultati in partizioni. La funzione

finestra viene applicata a ogni singola partizione e il calcolo viene riavviato per ogni partizione. ORDER BY Specifica l'ordine di applicazione della funzione 71 finestra di rango.

Funzioni di rango
Le funzioni di rango restituiscono un valore di rango, ad esempio il numero di riga, per ogni riga di una partizione. In base alla funzione utilizzata, possibile che venga assegnato lo stesso valore a pi righe.
ROW_NUMBER() OVER (PARTITION BY expression, ORDER BY

expression) Restituisce il numero sequenziale di una riga all'interno di una partizione di un set di risultati, a partire da 1 per la prima riga di ogni partizione. RANK() OVER (PARTITION BY expression, ORDER BY expression) Restituisce il rango di ogni riga all'interno della partizione di un set di risultati. DENSE_RANK() OVER (PARTITION BY expression, ORDER BY expression) Restituisce il rango delle righe nella partizione di un set dei risultati, senza gap nell'assegnazione dei ranghi. NTILE(number) OVER (PARTITION BY expression, ORDER BY expression)

72

INSERT (1)
Ha la funzione di inserire i dati nelle tabelle. Le colonne di destinazione dei valori possono essere o meno dichiarate nel comando. Se non vengono dichiarate, necessario passare al comando un valore per ogni colonna della tabella, rispettando rigorosamente l'ordine delle colonne stesse. Se, invece, le colonne di destinazione vengono dichiarate, possibile indicare le sole colonne per le quali vengono passati dei valori, purch vengano inseriti comunque i valori per tutte le colonne NOT NULL (che non possono essere nulle) della tabella.

73

INSERT (2)
Sintassi semplice: INSERT INTO nome_tabella [ (elenco_campi ) ] VALUES ('elenco_valori') Sintassi con query: INSERT INTO nome_tabella [ (elenco_campi ) ] SELECT ... FROM

74

UPDATE
Ha la funzione di modificare i dati contenuti in una tabella. Il nome di ogni campo che deve essere modificato va dichiarato dopo la parola chiave SET. Sintassi: UPDATE nome_tabella SET nome_campo = 'valore' WHERE Specifica le condizioni che limitano le righe da aggiornare. Se viene omesso aggiorna tutte le righe della tabella. FROM Specifica che una tabella, vista o origine di tabella derivata viene utilizzata per fornire i criteri per l'operazione di aggiornamento

75

DELETE
Ha la funzione di cancellare i dati dalle tabelle. Sintassi: DELETE [ FROM ] nome_tabella WHERE condizione Se la clausola WHERE viene omessa, l'istruzione DELETE elimina tutte le righe della tabella.

76

TRUNCATE
Rimuove tutte le righe da una tabella, ma non rimuove la struttura della tabella e le relative colonne, i vincoli, gli indici e cos via. Dal punto di vista funzionale TRUNCATE TABLE equivale all'istruzione DELETE senza clausola WHERE. pi rapida e utilizza un numero minore di risorse di sistema e del log delle transazioni rispetto alla DELETE. Sintassi: TRUNCATE TABLE nome_tabella

77

Parte terza TRANSACT-SQL

no 2007

Introduzione
Transact-SQL (abbreviato in T-SQL) lestensione proprietaria di Microsoft per avere a disposizione un linguaggio di programmazione completo per la gestione dei propri database SqlServer. un linguaggio che integra le clausole specifiche dellSQL con le clausole necessarie a qualsiasi linguaggio di programmazione, ossia, per fare qualche esempio:
definizione di variabili; istruzioni di controllo del flusso; gestione degli errori.

79

Utilizzi del Transact-SQL


Il linguaggio Transact-SQL utilizzato per la definizione di tutte le entit procedurali necessarie al corretto funzionamento di un database, in particolare:
STORED PROCEDURE: programmi che possono

accettare dei parametri ed eseguono una serie di istruzioni; non restituiscono nulla;
FUNCTION: programmi che possono accettare dei

parametri e restituiscono un risultato, di tipo scalare (numero, testo, ecc.) o tabellare;


TRIGGER: particolari programmi legati direttamente alle

tabelle che si attivano in automatico al verificarsi di determinate condizioni, ad esempio laggiornamento o la cancellazione di una riga.
80

Commenti
In T-SQL, come in qualsiasi linguaggio di programmazione, la prima regola di sintassi da imparare e di solito, anche la prima che si dimentica di applicare - la scrittura dei commenti. In T-SQL ne esistono di due tipi: -- questo un commento su una riga singola /* questo un commento su pi righe */

81

Variabili
Per dichiarare una variabile la sintassi la seguente: DECLARE @nome_variabile tipo_dato il suo valore iniziale viene impostato a NULL. Il nome della variabile deve obbligatoriamente iniziare con il carattere chiocciola @. Esistono due modi per valorizzare la variabile dichiarata. Quando si tratta di una semplice assegnazione si usa la sintassi: SET @nome_variabile = espressione nel caso in cui invece il valore da assegnare deriva da un'interrogazione, la sintassi la seguente: SELECT @nome_variabile = espressione FROM Con questa seconda sintassi possibile assegnare

82

Istruzioni per il controllo dei flussi


Il linguaggio T-SQL, come tutti gli altri linguaggi di programmazione, fornisce alcune parole chiave per specificare l'ordine e/o le condizioni che determinano l'esecuzione di un frammento di codice. In particolare, le istruzioni pi significative sono le seguenti:
BEGIN END IF ELSE WHILE (BREAK, CONTINUE) GOTO RETURN TRY CATCH

83

BEGIN END
Tramite la clausola BEGIN END possibile specificare un blocco di istruzioni che devono essere eseguite una di seguito all'altra. I blocchi BEGIN END possono essere nidificati fra loro. La sintassi la seguente: BEGIN blocco diistruzioni END Ad esempio: BEGIN SET @varibile = 'ciao mondo!' PRINT @varibile END
84

IF ELSE (1)
Se si vuole che un'azione venga eseguita se una condizione vera, ed un'altra se la condizione falsa, occorre utilizzare l'istruzione IF. Il blocco di istruzioni dopo ELSE saranno eseguite qualora la condizione dovesse risultare falsa. L' ELSE non obbligatorio. possibile nidificare condizioni IF dopo un'altra condizione IF o una parola chiave ELSE. Nel caso di un blocco di istruzioni, necessario racchiuderle tra le parole chiave BEGIN e END

85

IF ELSE (2)
Sintassi: IF condizione istruzione ELSE istruzione Oppure: IF espressione BEGIN istruzione istruzione END ELSE BEGIN istruzioni END

86

WHILE (1)
Tramite la clausola WHILE una serie di istruzioni vengono eseguite ripetutamente per tutto il tempo in cui la condizione specificata risulta vera. possibile controllare l'esecuzione di istruzioni nel ciclo WHILE dall'interno del ciclo tramite le parole chiave BREAK e CONTINUE, generalmente tramite un'istruzione IF ELSE. Sintassi: WHILE condizione BEGIN blocco diistruzioni IF condizione [BREAK | CONTINUE] blocco diistruzioni END
BREAK consente di uscire dal ciclo WHILE pi interno. Vengono

eseguite le istruzioni che si trovano dopo la parola chiave END, che segna la fine del ciclo. CONTINUE consente il riavvio del ciclo WHILE, ignorando tutte le istruzioni che seguono.
87

WHILE (2)
Ad esempio, il seguente blocco di codice utilizza un blocco WHILE per scrivere i numeri da 1 a 10: DECLARE @valore int SET @valore = 1 WHILE @valore <= 10 BEGIN PRINT @valore SET @valore = @valore + 1 END

88

Cursori (1)
Nei database relazionali le operazioni vengono eseguite su set di righe completi. Le applicazioni non sono sempre in grado di gestire in modo efficiente un intero set di risultati come singola unit. In tali casi deve essere pertanto disponibile un meccanismo per l'elaborazione di una riga singola o di un blocco di righe di dimensioni ridotte. I cursori sono un'estensione dei set di risultati che implementano appunto tale meccanismo. I cursori estendono l'elaborazione dei risultati nel modo seguente:
Consentono il posizionamento su righe specifiche del set di

risultati. Recuperano una riga o un blocco di righe dalla posizione corrente del set di risultati. Supportano la modifica dei dati delle righe in corrispondenza della posizione corrente del set di risultati.

In SqlServer possibile utilizzare vari tipi di cursori, che si

89

Cursori (2)
L'utilizzo di un cursore richiede generalmente le seguenti istruzioni:
dichiarazione : DECLARE apertura: OPEN l'assegnazione dei campi a varibili: FETCH l'elaborazione delle righe tramite un ciclo WHILE chiusura: CLOSE rimozione dei riferimenti al cursore: DEALLOCATE

Vediamo di seguito un esempio completo relativo a un cursore che lavora ciclicamente su 2 colonne di un set di righe e utilizza le informazioni per scrivere dei messaggi.

90

Cursori (3)
DECLARE @Nome varchar(10), @Anno int DECLARE cur_persone CURSOR FOR SELECT Nome, Anno FROM dbo.Persone OPEN cur_persone FETCH NEXT FROM cur_persone INTO @ Nome, @Anno WHILE @@FETCH_STATUS = 0 BEGIN PRINT(@Nome + ' ha ' + cast(2011 - @Anno as varchar) + ' anni') FETCH NEXT FROM cur_persone INTO @Nome, @Anno END CLOSE cur_persone DEALLOCATE cur_persone
91

Gestione degli errori: TRY... CATCH (1)


Gli errori nel codice T-SQL possono essere elaborati utilizzando un costrutto TRY CATCH in modo simile a quanto avviene nella maggior parte dei linguaggi di programmazione moderni. Tale costrutto costituito da due parti: un blocco TRY e un blocco CATCH. Quando viene rilevata una condizione di errore in un'istruzione contenuta in un blocco TRY, il controllo viene passato a un blocco CATCH, dove pu essere eseguita l'elaborazione dell'errore. Quindi le istruzioni successive all'istruzione che ha generato l'errore non verranno eseguite. Dopo la gestione dell'eccezione da parte del blocco CATCH, il controllo viene trasferito alla prima istruzione successiva all'istruzione END CATCH. Se nel blocco TRY non sono presenti errori, il controllo passa all'istruzione immediatamente successiva all'istruzione END

92

Gestione degli errori: TRY... CATCH (2)


Un blocco TRY inizia con l'istruzione BEGIN TRY e termina con l'istruzione END TRY. Tale blocco deve essere immediatamente seguito da un blocco CATCH. Un blocco CATCH inizia con l'istruzione BEGIN CATCH e termina con l'istruzione END CATCH. In T-SQL ogni blocco TRY associato a un solo blocco CATCH. Di seguito riportiamo la sintassi base per l'utilizzo di un blocco TYR CATCH:
BEGIN TRY istruzione istruzione SELECT 1/0 -- istruzione che genera un errore di divisione per zero istruzione END TRY BEGIN CATCH gestione dell'errore END CATCH

93

Gestione degli errori: TRY... CATCH (3)


All'interno del blocco CATCH possibile recuperare informazioni sull'eccezione verificatasi tramite alcune funzioni di errore predefinite:
ERROR_NUMBER() restituisce il numero di errore. ERROR_MESSAGE() restituisce il testo completo del messaggio

di errore. Il testo include i valori specificati per eventuali parametri sostituibili, ad esempio lunghezze, nomi di oggetti o orari. ERROR_SEVERITY() restituisce la gravit dell'errore. ERROR_LINE() restituisce il numero di riga nella routine che ha causato l'errore. ERROR_PROCEDURE() restituisce il nome della stored procedure o del trigger in cui si verificato l'errore.

94

Gestione degli errori: @@ERROR


Nelle versioni precedenti di Sql Server la gestione degli errori avveniva tramite l'utilizzo della variabile di sistema @@ERROR. Tale variabile restituisce 0 se l'ultima istruzione TSQL stata eseguita correttamente, oppure un numero di errore se l'istruzione ha generato un errore. Per conoscere il significato dell'errore necessario interrogare la vista di sistema sys.messages. Il valore di @@ERROR cambia ogni volta che un'istruzione TSQL viene completata. La funzione @@ERROR deve essere pertanto elaborata in uno dei due modi seguenti:
Testare o utilizzare @@ERROR subito dopo l'istruzione T-SQL. Salvare @@ERROR in una variabile di tipo integer subito dopo il

completamento dell'istruzione. Il valore della variabile potr essere utilizzato in un secondo momento.

Un'altra variabile di sistema che pu rivelarsi utile per la gestione di situazioni non previste @@ROWCOUNT che restituisce il numero di righe lette o elaborate dall'istruzione precedente e permette quindi di fare delle verifiche sul buon 95

Transazioni
Con il termine transazione si intende una singola unit di lavoro - generalmente costituita da una o pi operazioni di inserimento, modifica o cancellazione - che deve essere eseguita interamente. Se tutte le operazioni vanno a buon fine, le modifiche ai dati vengono rese persistenti, ossia viene effettuato il commit della transazione. Se, al contrario, si verificano errori viene effettuato il rollback e quindi tutte le modifiche ai dati andranno perse. SQL Server supporta le modalit per le transazioni seguenti.
Transazioni con autocommit: ogni istruzione corrisponde a una

transazione. l'impostazione di default. Transazioni esplicite: ogni transazione viene avviata in modo esplicito tramite l'istruzione BEGIN TRANSACTION e terminata con un'istruzione esplicita COMMIT o ROLLBACK. Transazioni implicite: una nuova transazione viene avviata in modo implicito al termine di una transazione precedente, ma tutte le transazioni vengono terminate in modo esplicito con

96

Transazioni esplicite
Per transazione esplicita si intende una transazione di cui vengono definiti in modo esplicito l'inizio e la fine. Per definire tali transazioni vengono utilizzate le istruzioni BEGIN TRANSACTION, COMMIT TRANSACTION, ROLLBACK TRANSACTION.
BEGIN TRANSACTION: Contrassegna il punto iniziale di una

transazione esplicita per una connessione. COMMIT TRANSACTION: Consente di completare una transazione se non si sono verificati errori. Tutte le modifiche dei dati eseguite nella transazione vengono integrate in modo permanente nel database e le risorse utilizzate dalla transazione vengono liberate. ROLLBACK TRANSACTION: Consente di annullare una transazione in cui si sono verificati errori. Per tutti i dati modificati dalla transazione viene ripristinato lo stato precedente l'inizio della transazione e le risorse utilizzate dalla transazione vengono liberate.
97

Gestione errori nelle TRANSAZIONI


Di seguito vediamo un esempio di gestione degli errori all'interno di una transazione attraverso l'utilizzo di un blocco TRY CATCH:
SET XACT_ABORT ON BEGIN TRY BEGIN TRANSACTION istruzione istruzione WHILE XACT_STATE() = 1 BEGIN COMMIT TRANSACTION END END TRY BEGIN CATCH test su ERROR_NUMBER(), ERROR_MESSAGE() WHILE XACT_STATE() <> 0 BEGIN ROLLBACK TRANSACTION END END CATCH

98

TRANSACTION ISOLATION LEVEL


In SqlServer 2005 possibile indicare quale debba essere il comportamento delle query che cercano di accedere a delle tabelle che risultano in fase di aggiornamento da parte di una o pi transazioni. La sintassi la seguente: SET TRANSACTION ISOLATION LEVEL impostazione dove il parametro impostazione pu valere: READ UNCOMMITTED
Specifica che le istruzioni possono leggere le righe modificate da

altre transazioni ma di cui non ancora stato eseguito il commit.

READ COMMITTED
Specifica che le istruzioni possono leggere le righe modificate da

altre transazioni soltanto quando sia stato eseguito il commit. Questa l'opzione predefinita in SQL Server.

99

Tabelle temporanee
Nel caso si debbano eseguire operazioni complesse che richiedono pi passaggi, risulta molto comodo utilizzare le tabelle temporanee. Tali tabelle - il cui nome deve iniziare con il simbolo cancelletto # - non esistono fisicamente sul database sul quale stiamo lavorando, ma risultano disponibile, dopo la loro creazione, soltanto durante il ciclo di vita della connessione che le ha create su un apposito database temporaneo. Dalle altre connessioni risulter non solo non disponibile la stessa tabella denominata "#tmpTable" ma sar addirittura possibile crearne un'altra con lo stesso nome. Sar compito del motore mantenere nettamente separate e distinte le due tabelle tra le diverse connessioni. I modi per crearle sono essenzialmente:
con i normali comandi T-SQL di tipo DDL, ad esempio CREATE

TABLE #tabella_temporanea; con il comando SELECT...INTO #tabella_temporanea;

100

STORED PROCEDURE (1)


un programma scritto in T-SQL che pu accettare dei parametri ed esegue una serie di operazioni, generalmente di tipo DML ma non solo. Non restituisce nulla (anche se pu modificare il valore dei parametri per i quali sia stato impostato il modificatore OUTPUT). Per crearla: CREATE PROCEDURE nome_procedura AS Per modificarla: ALTER PROCEDURE nome_procedura AS Per eliminarla DROP PROCEDURE nome_procedura Per eseguirla: EXEC nome_procedura
101

STORED PROCEDURE (2)


Vediamo un esempio di dichiarazione di una procedura che non accetta parametri: CREATE PROCEDURE nome_procedura AS codice T-SQL E di una procedura che accetta due parametri in input: CREATE PROCEDURE nome_procedura @param1 nvarchar(50), @param2 nvarchar(50) OUTPUT AS codice T-SQL Il modificatore OUTPUT sul secondo parametro permette alla procedura di modificarne il valore. Tale valore modificato risulter quindi visibile nel blocco di codice da cui stata chiamata la procedura. 102

FUNCTION (1)
Le funzioni sono delle routine T-SQL che restituiscono un valore. Non possibile utilizzare funzioni definite dall'utente per eseguire azioni che modificano lo stato del database. In modo analogo alle funzioni di sistema, le funzioni definite dall'utente possono essere richiamate da una query. Per crearla: CREATE FUNCTION nome_funzione Per modificarla: ALTER FUNCTION nome_funzione Per eliminarla DROP FUNCTION nome_funzione Per eseguirla: SELECT nome_procedura(param1, , paramN)
103

FUNCTION (2)
Vediamo un esempio di dichiarazione di una procedura : CREATE FUNCTION nome_funzione ( @param1 int, @param2 varchar(5) ) RETURNS tipo_dato [(lunghezza )] AS BEGIN codice T-SQL RETURN valore END

104

TRIGGER (1)
Un trigger un tipo speciale di stored procedure, definita su una specifica tabella o vista, che viene eseguita automaticamente quando si verifica un evento nel server di database. Esistono sia trigger DML che trigger DDL. I trigger DML possono essere attivati da un o pi eventi specifici di INSERT, UPDATE o DELETE e possono essere due tipi:.
AFTER: il trigger viene attivato solo al termine dell'esecuzione di

tutte le operazioni specificate nell'istruzione che lo ha attivato. Affinch il trigger venga attivato, inoltre necessario che siano stati completati tutti i controlli dei vincoli e le operazioni referenziali di propagazione. INSTEAD OF: il trigger viene eseguito al posto dell'istruzione che lo ha attivato, che quindi non verranno eseguite.

105

TRIGGER (2)
Vediamo un semplice esempio di difinizione di un trigger DML che viene attivato DOPO lesecuzione su una tabella di unoperazione di INSERT o di UPDATE: CREATE TRIGGER nome_trigger ON tabella AFTER INSERT, UPDATE AS codice T-SQL

106

Riferimento
Per avere i riferimenti dettagliati di tutte le istruzioni e le funzioni a cui si fatto riferimento in queste slide, si consiglia di consultare la sezione del sito MSDN di Microsoft relativa al linguaggio Transact-SQL, allindirizzo: http://msdn.microsoft.com/itit/library/ms189826%28v=sql.90%29.aspx

107

Potrebbero piacerti anche