Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill,

Slides:



Advertisements
Presentazioni simili
TAV.1 Foto n.1 Foto n.2 SCALINATA DI ACCESSO ALL’EREMO DI SANTA CATERINA DEL SASSO DALLA CORTE DELLE CASCINE DEL QUIQUIO Foto n.3 Foto n.4.
Advertisements

Accesso ai dati su Relational Database Management Systems LSA - Laboratorio di Sistemi Informativi Economico-Aziendali Salvatore Ruggieri Dipartimento.
Sicurezza e concorrenza nelle basi di dati
Massa Laura Mela Enrica
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Java DataBase Connectivity (JDBC)
SQL – argomenti avanzati
Frontespizio Economia Monetaria Anno Accademico
Database nel Web Modulo Didattico: Francesca Platania
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999
Basi di dati - Modelli e linguaggi di interrogazione- Paolo Atzeni, Stefano Ceri, Stefano Paraboschi, Riccardo Torlone Copyright © The McGraw-Hill.
Elementi di PL/SQL.
OO.1 Marco Ronchetti - Java Sql package.
1 IT FOR BUSINESS AND FINANCE ACCESS INTRODUCTION.
Programmazione 1 9CFU – TANTE ore
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
Corso di Informatica (Basi di Dati)
1 Corso di Laurea in Biotecnologie Informatica (Basi di Dati) SQL: Data Manipulation Language (DML) Anno Accademico 2009/2010 Da: Atzeni, Ceri, Paraboschi,
Corso di Laurea in Biotecnologie Informatica (Programmazione)
Ufficio Studi UNIONCAMERE TOSCANA 1 Presentazione di Riccardo Perugi Ufficio Studi UNIONCAMERE TOSCANA Firenze, 19 dicembre 2000.
eliana minicozzi linguaggi1a.a lezione2
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
Basi di dati attive Paolo Atzeni.
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999
Strutture di controllo in C -- Flow Chart --
Modello Relazionale Definisce tipi attraverso il costruttore relazione, che organizza i dati secondo record a struttura fissa, rappresentabili attraverso.
Modello Relazionale Definisce tipi attraverso il costruttore relazione, che organizza i dati secondo record a struttura fissa, rappresentabili attraverso.
Programma del Corso Dati e DBMS DBMS relazionali SQL
Vincoli di integrità generici Con i costrutti visti sinora, non è sempre possibile definire tutti i possibili vincoli di integrità. Per questo esiste listruzione.
Manipolazione dei dati I comandi SQL che permettono di modificare il contenuto di una base di dati sono insertdeleteupdate insert ha la seguente sintassi:
Analisi di Immagini e Dati Biologici
JDBC(TM) Database Access
Elaborazione di Franco Grivet Chin
Corso di PHP.
Basi di dati Claudia Raibulet
Corso di INFORMATICA anno scolastico 2009/10 Linguaggio SQL IDENTIFICATORI di tabelle e attributi: stringhe di lunghezza max 18 caratteri, composte da.
1 Negozi Nuove idee realizzate per. 2 Negozi 3 4.
TECNOLOGIE DELLINFORMAZIONE E DELLA COMUNICAZIONE PER LE AZIENDE Materiale di supporto alla didattica.
21 marzo 2002 (ri-)Avvisi: Giovedi 28 marzo la lezione e sospesa. Nuovo indirizzo di Spedire messaggi e esercizi solo.
1 Ly-LAB Sistema di gestione dei dati analitici di laboratorio.
Basi di Dati e Sistemi Informativi SQL per Applicazioni Home page del corso:
1 Il Linguaggio SQL Il Linguaggio SQL Prof. Lorenzo Vita, Ing. Luigi Testa.
14 marzo 2002 Avvisi:.
BIOINFO3 - Lezione 41 ALTRO ESEMPIO ANCORA Progettare il comando di creazione di una tabella di pubblicazioni scientifiche. Come chiave usare un numero.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
1Piero Scotto - C14. Finalità del corso Programma Materiale Requisiti Spendibilità 2Piero Scotto - C14.
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill,
Dati e DBMS DBMS relazionali SQL Progettazione di una base di dati Programma del Corso.
Appunti di Java (J2SDK 1.4.2, JDK 1.6.0) prof. Antonella Schiavon settembre 2009.
Basi di dati - Modelli e linguaggi di interrogazione- Paolo Atzeni, Stefano Ceri, Stefano Paraboschi, Riccardo Torlone Copyright © The McGraw-Hill.
Il linguaggio Fortran 90: 3. Procedure e Funzioni
Ingresso e uscita in Java F. Bombi 10 ottobre 2002.
FUNZIONI Dichiarazione: Definizione:
Pagine ASP parte 3 I data base Stefano Schacherl.
IL GIOCO DEL PORTIERE CASISTICA. Caso n. 1 Il portiere nella seguente azione NON commette infrazioni.
PLSQL 1.1 LA REALIZZAZIONE DI APPLICAZIONI Quattro parti: Gestione dati Business rules Logica applicativa Interfaccia utente Molte possibili architetture.
SQL, esempi 30/10/2014Basi di dati SQL1. 30/10/2014Basi di dati SQL2 CREATE TABLE, esempi CREATE TABLE corsi( codice numeric NOT NULL PRIMARY KEY, titolo.
Capitolo 6 Iterazione Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
Interazione col DB Per interagire con una base dati da una pagina PHP occorre procedere come segue: Eseguire la connessione al DBMS MySQL in ascolto;
Esercizio ODBC. Configurare il driver ODBC Start  Control Panel  Administrative Tools Aprire: Data Source(ODBC) User DSN  Add…. Selezionare il driver.
MySQL Database Management System
Database Elaborato da: Claudio Ciavarella & Marco Salvati.
PLSQL 1.1 LA REALIZZAZIONE DI APPLICAZIONI Quattro parti: Gestione dati Business rules Logica applicativa Interfaccia utente Molte possibili architetture.
Linguaggi per basi di dati Linguaggi di definizione dei dati Utilizzati per definire gli schemi e le autorizzazioni per l’accesso Linguaggi di manipolazione.
Gaetano Anastasi Beatrice Miotti Lorenzo Guerriero Monica Pellegrinelli Massimiliano Sartor Giorgio Macauda SQLite Esempi di utilizzo della libreria in.
Linguaggio SQL prima parte Linguaggio SQL prima parte A. Lorenzi, E. Cavalli INFORMATICA PER SISTEMI INFORMATIVI AZIENDALI Copyright © Istituto Italiano.
Linguaggio SQL. Linguaggi per database La diffusione del modello relazionale ha favorito l’uso prevalente di linguaggi non procedurali: in questo modo.
Transcript della presentazione:

Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1996-2002 Capitolo 5: SQL nei linguaggi di programmazione 21/10/2002

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 SQL e applicazioni In applicazioni complesse, l’utente non vuole eseguire comandi SQL, ma programmi, con poche scelte SQL non basta, sono necessarie altre funzionalità, per gestire: input (scelte dell’utente e parametri) output (con dati che non sono relazioni o se si vuole una presentazione complessa) per gestire il controllo 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

SQL e linguaggi di programmazione Le applicazioni sono scritte in linguaggi di programmazione tradizionali: Cobol, C, Java, Fortran linguaggi “ad hoc”, proprietari e non: PL/SQL, Informix4GL, Delphi Vediamo solo l’approccio “tradizionale”, perché più generale 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Applicazioni ed SQL: architettura Applicazione 1 Java DBMS Applicazione 2 C Base di dati Applicazione 3 Delphi Risultati 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Una difficoltà importante Conflitto di impedenza (“disaccoppiamento di impedenza”) fra base di dati e linguaggio linguaggi: operazioni su singole variabili o oggetti SQL: operazioni su relazioni (insiemi di ennuple) 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 Altre differenze, 1 Accesso ai dati e correlazione: linguaggio: dipende dal paradigma e dai tipi disponibili; ad esempio scansione di liste o “navigazione” tra oggetti SQL: join (ottimizzabile) 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 Altre differenze, 2 tipi di base: linguaggi: numeri, stringhe, booleani SQL: CHAR, VARCHAR, DATE, ... costruttori di tipo: linguaggio: dipende dal paradigma SQL: relazioni e ennuple 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

SQL e linguaggi di programmazione: tecniche principali SQL immerso (“Embedded SQL”) sviluppata sin dagli anni ’70 “SQL statico” SQL dinamico Call Level Interface (CLI) più recente SQL/CLI, ODBC, JDBC 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 SQL immerso le istruzioni SQL sono “immerse” nel programma redatto nel linguaggio “ospite” un precompilatore (legato al DBMS) viene usato per analizzare il programma e tradurlo in un programma nel linguaggio ospite (sostituendo le istruzioni SQL con chiamate alle funzioni di una API del DBMS) 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 SQL immerso, un esempio #include<stdlib.h> main(){ exec sql begin declare section; char *NomeDip = "Manutenzione"; char *CittaDip = "Pisa"; int NumeroDip = 20; exec sql end declare section; exec sql connect to utente@librobd; if (sqlca.sqlcode != 0) { printf("Connessione al DB non riuscita\n"); } else { exec sql insert into Dipartimento values(:NomeDip,:CittaDip,:NumeroDip); exec sql disconnect all; } } 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

SQL immerso, commenti al codice EXEC SQL denota le porzioni di interesse del precompilatore: definizioni dei dati istruzioni SQL le variabili del programma possono essere usate come “parametri” nelle istruzioni SQL (precedute da “:”) dove sintatticamente sono ammesse costanti 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

SQL immerso, commenti al codice, 2 sqlca è una struttura dati per la comunicazione fra programma e DBMS sqlcode è un campo di sqlca che mantiene il codice di errore dell’ultimo comando SQL eseguito: zero: successo altro valore: errore o anomalia 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 SQL immerso, fasi Sorgente LP + SQL Precompilazione Precompilato LP Compilazione Codice oggetto Librerie (del DBMS) Collegamento Eseguibile 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 Un altro esempio int main() { exec sql connect to universita user pguser identified by pguser; exec sql create table studente (matricola integer primary key, nome varchar(20), annodicorso integer); exec sql disconnect; return 0; } 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

L’esempio “precompilato” /* These include files are added by the preprocessor */ #include <ecpgtype.h> #include <ecpglib.h> #include <ecpgerrno.h> #include <sqlca.h> int main() { ECPGconnect(__LINE__, "universita" , "pguser" , "pguser" , NULL, 0); ECPGdo(__LINE__, NULL, "create table studente ( matricola integer primary key , nome varchar ( 20 ) , annodicorso integer )", ECPGt_EOIT, ECPGt_EORT); ECPGdisconnect(__LINE__, "CURRENT"); return 0; } 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Note Il precompilatore è specifico della combinazione linguaggio-DBMS-sistema operativo 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Interrogazioni in SQL immerso: conflitto di impedenza Il risultato di una select è costituito da zero o piú ennuple: zero o una: ok -- l’eventuale risultato puó essere gestito in un record piú ennuple: come facciamo? l’insieme (in effetti, la lista) non è gestibile facilmente in molti linguaggi Cursore: tecnica per trasmettere al programma una ennupla alla volta 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 Cursore Programma select … DBMS Buffer del programma 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 Nota Il cursore accede a tutte le ennuple di una interrogazione in modo globale (tutte insieme o a blocchi – è il DBMS che sceglie la strategia efficiente) trasmette le ennuple al programma una alla volta 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Operazioni sui cursori Definizione del cursore declare NomeCursore [ scroll ] cursor for Select … Esecuzione dell'interrogazione open NomeCursore Utilizzo dei risultati (una ennupla alla volta) fetch NomeCursore into ListaVariabili Disabilitazione del cursore close cursor NomeCursore Accesso alla ennupla corrente (di un cursore su singola relazione a fini di aggiornamento) current of NomeCursore nella clausola where 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 write('nome della citta''?'); readln(citta); EXEC SQL DECLARE P CURSOR FOR SELECT NOME, REDDITO FROM PERSONE WHERE CITTA = :citta ; EXEC SQL OPEN P ; EXEC SQL FETCH P INTO :nome, :reddito ; while SQLCODE = 0 do begin write('nome della persona:', nome, 'aumento?'); readln(aumento); EXEC SQL UPDATE PERSONE SET REDDITO = REDDITO + :aumento WHERE CURRENT OF P EXEC SQL FETCH P INTO :nome, :reddito end; EXEC SQL CLOSE CURSOR P 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 void VisualizzaStipendiDipart(char NomeDip[]) { char Nome[20], Cognome[20]; long int Stipendio; $ declare ImpDip cursor for select Nome, Cognome, Stipendio from Impiegato where Dipart = :NomeDip; $ open ImpDip; $ fetch ImpDip into :Nome, :Cognome, :Stipendio; printf("Dipartimento %s\n",NomeDip); while (sqlcode == 0) printf("Nome e cognome dell'impiegato: %s %s",Nome,Cognome); printf("Attuale stipendio: %d\n",Stipendio); } $ close cursor ImpDip; 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 Cursori, commenti Per aggiornamenti e interrogazioni “scalari” (cioè che restituiscano una sola ennupla) il cursore non serve: select Nome, Cognome into :nomeDip, :cognomeDip from Dipendente where Matricola = :matrDip; 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 Cursori, commenti, 2 I cursori possono far scendere la programmazione ad un livello troppo basso, pregiudicando la capacità dei DBMS di ottimizzare le interrogazioni: se “nidifichiamo” due o più cursori, rischiamo di reimplementare il join! 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Esercizio Studenti(Matricola, Cognome, Nome) Esami(Studente,Materia,Voto,Data) Corsi(Codice,Titolo) con gli ovvî vincoli di integrità referenziale Stampare, per ogni studente, il certificato con gli esami e il voto medio 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 Output Matricola Cognome Nome Materia Data Voto … VotoMedio 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Esercizio Studenti(Matricola, Cognome, Nome) Esami(Studente,Materia,Voto,Data) Corsi(Codice,Titolo) Iscrizioni(Studente,AA,Anno,Tipo) con gli ovvî vincoli di integrità referenziale Stampare, per ogni studente, il certificato con gli esami e le iscrizioni ai vari anni accademici 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 Output Matricola Cognome Nome AnnoAccademico AnnoDiCorso TipoIscrizione … Materia Data Voto 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 SQL dinamico Non sempre le istruzioni SQL sono note quando si scrive il programma Allo scopo, è stata definita una tecnica completamente diversa, chiamata Dynamic SQL che permette di eseguire istruzioni SQL costruite dal programma (o addirittura ricevute dal programma attraverso parametri o da input) Non è banale gestire i parametri e la struttura dei risultati (non noti a priori) 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 SQL dinamico Le operazioni SQL possono essere: eseguite immediatamente execute immediate SQLStatement prima “preparate”: prepare CommandName from SQLStatement e poi eseguite (anche più volte): execute CommandName [ into TargetList ] [ using ParameterList ] 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 Call Level Interface Indica genericamente interfacce che permettono di inviare richieste a DBMS per mezzo di parametri trasmessi a funzioni standard SQL/CLI (’95 e poi parte di SQL:1999) ODBC: implementazione proprietaria di SQL/CLI JDBC: una CLI per il mondo Java 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 SQL immerso vs CLI SQL immerso permette precompilazione (e quindi efficienza) uso di SQL completo CLI indipendente dal DBMS permette di accedere a più basi di dati, anche eterogenee 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 JDBC Una API (Application Programming Interface) di Java (intuitivamente: una libreria) per l'accesso a basi di dati, in modo indipendente dalla specifica tecnologia JDBC è una interfaccia, realizzata da classi chiamate driver: l'interfaccia è standard, mentre i driver contengono le specificità dei singoli DBMS (o di altre fonti informative) 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 I driver JDBC (A titolo di curiosità; può bastare il primo tipo) Esistono quattro tipi di driver (chiamati, in modo molto anonimo, tipo 1, tipo 2, tipo 3, tipo 4): Bridge JDBC-ODBC: richiama un driver ODBC, che deve essere disponibile sul client; è comodo ma potenzialmente inefficiente Driver nativo sul client: richiama un componente proprietario (non necessariamente Java) sul client Driver puro Java con server intermedio ("middleware server"): comunica via protocollo di rete con il server intermedio, che non deve risiedere sul client Driver puro Java, con connessione al DBMS: interagisce direttamente con il DBMS 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Il funzionamento di JDBC, in breve Caricamento del driver Apertura della connessione alla base di dati Richiesta di esecuzione di istruzioni SQL Elaborazione dei risultati delle istruzioni SQL 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 Un programma con JDBC import java.sql.*; public class PrimoJDBC { public static void main(String[] arg){ Connection con = null ; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:Corsi"; con = DriverManager.getConnection(url); } catch(Exception e){ System.out.println("Connessione fallita"); Statement query = con.createStatement(); ResultSet result = query.executeQuery("select * from Corsi"); while (result.next()){ String nomeCorso = result.getString("NomeCorso"); System.out.println(nomeCorso); catch (Exception e){ System.out.println("Errore nell'interrogazione"); 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 Preliminari L'interfaccia JDBC è contenuta nel package java.sql import java.sql.*; Il driver deve essere caricato (trascuriamo i dettagli) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connessione: oggetto di tipo Connection che costituisce un collegamento attivo fra programma Java e base di dati; viene creato da String url = "jdbc:odbc:Corsi"; con = DriverManager.getConnection(url); 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Preliminari dei preliminari: origine dati ODBC Per utilizzare un driver JDBC-ODBC, la base di dati (o altro) deve essere definita come "origine dati ODBC" In Windows (con YYY, avendo già definito la base di dati xxx.yyy da collegare): Pannello di controllo Strumenti di amministrazione Opzione "Origini dati ODBC" Bottone "Aggiungi" ("Add") Nella finestra di dialogo "Crea Nuova origine dati" selezionare “YYY Driver" e nella successiva selezionare il file xxx.yyy attribuirgli un nome (che sarà usato da ODBC e quindi da JDBC) 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Esecuzione dell'interrogazione ed elaborazione del risultato Statement query = con.createStatement(); ResultSet result = query.executeQuery("select * from Corsi"); Elaborazione del risultato while (result.next()){ String nomeCorso = result.getString("NomeCorso"); System.out.println(nomeCorso); } 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 Statement Un'interfaccia i cui oggetti consentono di inviare, tramite una connessione, istruzioni SQL e di ricevere i risultati forniti Un oggetto di tipo Statement viene creato con il metodo createStatement di Connection I metodi dell'interfaccia Statement: executeUpdate per specificare aggiornamenti o istruzioni DDL executeQuery per specificare interrogazioni e ottenere un risultato execute per specificare istruzioni non note a priori executeBatch per specificare sequenze di istruzioni Vediamo executeQuery 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 ResultSet I risultati delle interrogazioni sono forniti in oggetti di tipo ResultSet (interfaccia definita in java.sql) In sostanza, un result set è una sequenza di ennuple su cui si può "navigare" (in avanti, indietro e anche con accesso diretto) e dalla cui ennupla "corrente" si possono estrarre i valori degli attributi Metodi principali: next() getXXX(posizione) es: getString(3); getInt(2) getXXX(nomeAttributo) es: getString("Cognome"); getInt("Codice") 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Specializzazioni di Statement PreparedStatement premette di utilizzare codice SQL già compilato, eventualmente parametrizzato rispetto alle costanti in generale più efficiente di Statement permette di distinguere più facilmente istruzioni e costanti (e apici nelle costanti) i metodi setXXX( , )permettono di definire i parametri CallableStatement premette di utilizzare "stored procedure", come quelle di Oracle PL/SQL o anche le query memorizzate (e parametriche) di Access 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 import java.sql.*; import javax.swing.JOptionPane; public class SecondoJDBCprep { public static void main(String[] arg){ try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:Corsi"; Connection con = DriverManager.getConnection(url); PreparedStatement pquery = con.prepareStatement( "select * from Corsi where NomeCorso LIKE ?"); String param = JOptionPane.showInputDialog( "Nome corso (anche parziale)?"); param = "%" + param + "%"; pquery.setString(1,param); ResultSet result = pquery.executeQuery(); while (result.next()){ String nomeCorso = result.getString("NomeCorso"); System.out.println(nomeCorso); } catch (Exception e){System.out.println("Errore");} 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 import java.sql.*; import javax.swing.JOptionPane; public class TerzoJDBCcall { public static void main(String[] arg){ try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:Corsi"; Connection con = DriverManager.getConnection(url); CallableStatement pquery = con.prepareCall("{call queryCorso(?)}"); String param = JOptionPane.showInputDialog( "Nome corso (anche parziale)?"); param = "*" + param + "*"; pquery.setString(1,param); ResultSet result = pquery.executeQuery(); while (result.next()){ String nomeCorso = result.getString("NomeCorso"); System.out.println(nomeCorso); } catch (Exception e){System.out.println("Errore");} 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 Altre funzionalità Molte, fra cui username e password aggiornamento dei ResultSet richiesta di metadati gestione di transazioni 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 Transazioni in JDBC Scelta della modalità delle transazioni: un metodo definito nell'interfaccia Connection: setAutoCommit(boolean autoCommit) con.setAutoCommit(true) (default) "autocommit": ogni operazione è una transazione con.setAutoCommit(false) gestione delle transazioni da programma con.commit() con.rollback() non c’è begin transaction 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5 Procedure SQL:1999 (come già SQL-2) permette la definizione di procedure e funzioni (chiamate genericamente “stored procedures”) Le stored procedures sono parte dello schema procedure AssignCity(:Dep char(20), :City char(20)) update Department set City = :City where Name = :Dep Lo standard prevede funzionalità limitate e non è molto recepito Molti sistemi offrono estensioni ricche (ad esempio Oracle PL/SQL e Sybase-Microsoft Transact SQL) 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5

Procedure in Oracle PL/SQL Procedure Debit(ClientAccount char(5),Withdrawal integer) is OldAmount integer; NewAmount integer; Threshold integer; begin select Amount, Overdraft into OldAmount, Threshold from BankAccount where AccountNo = ClientAccount for update of Amount; NewAmount := OldAmount - WithDrawal; if NewAmount > Threshold then update BankAccount set Amount = NewAmount where AccountNo = ClientAccount; else insert into OverDraftExceeded values(ClientAccount,Withdrawal,sysdate); end if; end Debit; 21/10/2002 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 5