Sei sulla pagina 1di 3

SQL e Linguaggi di Programmazione

Funzioni scalari in SQL sono funzioni valutate su ogni tupla coalesce(list) - prende in argomento una lista di campi e ne restituisce il primo non nullo nullif(campo, valore) restituisce NULL se campo=valore, altrimenti restituisce campo case sintassi che restituisce lespressione associata alla prima condizione soddisfatta: Esempio: select Nome, case when Voto <= 10 then Grav. Ins. when Voto <= 17 then Ins. else to_char(Voto) end funzioni matematiche come cos() funzioni su stringhe come substring() funzioni su dati temporali come today()

Uso di SQL nelle applicazioni gli utenti non usano direttamente SQL ma usano delle applicazioni per accedere alle basi di dati. Realizzate con: Linguaggi quarta generazione (integrati nei DBMS) Linguaggi normali come C++ con SQL integrato

SQL Embedded utilizzato ad esempio per inserire richieste SQL in C++ I comandi SQL sono preceduti da EXEC SQL e terminano con ; Precompilatore converte i comandi in chiamate ad una libreria interna che si interfaccia col DBMS Le variabili che verranno usate nelle richieste vanno in una sezione apposita che delimitata da: exec sql begin declare section; ... exec sql end declare section; Le variabili del programma vanno precedute da : quando usate come parametri nelle richiese SQL. Si usa exec sql connect to utente@database per connettersi al database. Si usa exec sql disconnect all per disconnettere tutto. Lambiente offre una variabile sqlca con una componente sqlcode che descrive lesito delle operazioni SQL, se vale 0 stato eseguito correttamente. SQL orientato a insiemi di tuple, ma i linguaggi tradizionali gestiscono una tupla alla volta (questo si chiama impedance mismatch o conflitto dimpedenza), si usano quindi i cursori, che restituiscono i risultati uno alla volta: exec sql declare nomecursore cursor for ComandoSQL - crea un nuovo cursore di nome nomecursore per la query ComandoSQL exec sql open nomecursore - esegue la query e mette il risultato nel cursore exec sql fetch into :var1, :var2, ... mette i valori della tupla corrente nelle variabili var1, var2 e sposta il cursore sulla query successiva, si controlla quando il ciclo finisce con la variabile sqlca.sqlcode . exec sql close nomecursore chiude il cursore e toglie i dati salvati Si usa SQL dinamico quando non si conosce a priori la query che verr eseguita: esecuzione diretta: exec sql execute immediate ComandoSql in alternativa prima si prepara il comando e poi si esegue: exec sql prepare nomecomando from ComandoSql exec sql execute nomecomando

Call Level Interface (o CLI) alternativa a SQL Embedded, sono librerie di sottoprogrammi che il programmatore pu utilizzare. Si usano nel modo: Programma per creare la connessione Si invia la richiesta come testo Ottiene risposta come set di risultati Si chiude la connessione

Le pi famose sono: ODBC Open DataBase Connectivity, sviluppato da Microsoft. Consiste di: Lapplicazione specifica il drivere e invia i comandi Driver Manager carica il driver richiesto Driver realizza il canale di comunicazione Sorgente Dati il database La sorgente dati spesso remota e ODBC permette di collegare anche sistemi eterogenei rendendo il tutto invisibile al programmatore. Per non a oggetti, quindi sono state sviluppate OLE DB e ADO. OLE DB - Interfaccia generale ad oggetti per accesso a sorgenti di dati anche non relazionali, si basa sugli oggetti COM caratteristici dei sistemi Microsoft. ADO - ActiveX Data Object, interfaccia per laccesso a OLE DB, si basa su 4 concetti fondamentali: Connection: instanzia il canale di comunicazione, contiene gli errori che possono accadere Command: contiene il comando SQL che si vuole fare eseguire alla sorgente Record: rappresenta la singola tupla RecordSet: rappresenta linsieme di tuple, svolge il ruolo del cursore. Utilizzo in VisualBasic:
Public Sub Dim Dim Dim Dim Dim InterrogaBD() setImpiegati As ADODB.Recordset conn As ADODB.Connection stringaSQL As String comSQL As ADODB.Command messaggio As String ' si stabilisce la connessione Set conn = New ADODB.Connection conn.Open "mioServer", "giovanni", "passwordsegreta" ' si carica l'insieme degli impiegati in setImpiegati Set setImpiegati = New ADODB.Recordset stringaSQL = "select Nome, Cognome, Data from Impiegato order by Cognome" comSQL.CommandText = stringaSQL setImpiegati.Open comSQL, conn, , , ' si stampano i dati di tutti gli impiegati Do While Not setImpiegati.EOF messaggio = "Impiegato: " & setImpiegati!Nome & _ setImpiegati!Cognome & "(record " & _ setImpiegati.AbsolutePosition & _ " di " & setImpiegati.RecordCount & ")" If MsgBox(messaggio, vbOkCancel) = vbCancel Then Exit Do setImpiegati.MoveNext Loop ' si fa pulizia setImpiegati.Close conn.Close Set setImpiegati = Nothing Set conn = Nothing

End Sub

JDBC Java Database Connectivity

E la libreria per Java, quindi ha una portabilit molto elevata. E simile a ODBC, esistono anche bridge per interfacciare ODBC/JDBC Esempio:
import java.sql.*; public class PrimoJdbc { public static void main(String[] arg) { Connection conn = null; try { // Caricamento del driver Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Apertura della connessione conn = DriverManager.getConnection("jdbc:odbc:Corsi"); } catch (Exception e) { System.exit(1); } try { // Esecuzione dell'interrogazione Statement interrogazione = conn.createStatement(); ResultSet risultato = interrogazione.executeQuery("select * from Corsi"); while (risultato.next()) { String nomeCorso = risultato.getString("NomeCorso"); System.out.println(nomeCorso); } } catch (Exception e) { System.exit(1); }

Procedure integrate nel DBMS moduli che svolgono una specifica attivit di manipolazione dati. Oracle permette di scrivere procedure molto complesse. Questo tipo di programmazione si divide in due momenti: DDL (dichiarazione, scrittura del programma) DML (invocazione del programma

Esempio:
procedure Prelievo (Prod integer, Quant integer) is begin Q1, Q2 integer; X exception; select QtaDisp, QtaRiord into Q1, Q2 from Magazzino where CodProd = Prod; if Q1 < Quant then raise(X); update Magazzino set QtaDisp = QtaDisp Quant where CodProd = Prod; if Q1 - Quant < Q2 then insert into Riordino values(Prod,sysdate,Q2) end;