Utilizzare SQL nelle applicazioni Sistemi Informativi Uso di SQL e nei linguaggi di programmazione DEE - Politecnico di Bari • Nella “vita reale” l’interazione con basi di dati utilizzando SQL non è diretta, ma mediata attraverso l’uso di programmi applicativi. Oltre ai tradizionali linguaggi di programmazione di alto livello procedurali ed a oggetti (Cobol,C,PL/SQL) esistono i cosiddetti linguaggi di quarta generazione (4GL) come Informix4GL che permettono di sviluppare complete applicazioni per la gestione di basi di dati. • SQL da solo non è Touring-Completo • E’ necessario stabilire modalità di interazione tra SQL e tali linguaggi. I problemi di interazione sono rappresentati dall’ Impedence mismatch (“disaccoppiamento di impedenza”) fra base di dati e linguaggio di programmazione poiché i linguaggi operano tipicamente su singole variabili o oggetti mentre SQL opera su relazioni (insiemi di tuple) • In alcuni approcci la soluzione ai problemi di interazione è rappresentata dall’uso dei cursori 2 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi PRINCIPALI APPROCCI DEE - Politecnico di Bari • Call Level Interface (CLI) SQL statico • SQL embedded (SQL “integrato”) SQL dinamico • Stored Procedures 3 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari EMBEDDED SQL • • Tecnica sviluppata sin dagli anni ’70 L’ SQL è “ospitato” in un linguaggio di programmazione, chiamato linguaggio ospite (Java, Pascal, Cobol, C, C++, …), in quanto questi standard hanno definito l’interfaccia con SQL: il sorgente del vostro programma contiene sia codice nel linguaggio di programmazione che codice sql • un preprocessore, dipendente sia dal linguaggio ospite che dalla piattaforma del DBMS viene usato per analizzare il codice e tradurlo sostituendo le istruzioni SQL con chiamate alle funzioni di una API del DBMS prima della compilazione vera e propria Ogni programma che usa Embedded SQL deve: 1. Definire quale database usare 2. Connettersi al database 3. Effettuare le operazioni sul database (usando cursori e statementSQL) 4. Disconnettersi dal database 4 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari ESEMPIO in C di SQL statico– prima…. #include<stdlib.h> #include<stdio.h> #include<sqlenv.h> main() { exec sql begin declare section; /*dichiarazione variabili*/ char *NomeDip = “DEE"; int Id_Dip = 3; exec sql end declare section; /*fine della dichiarazione variabili*/ } 5 exec sql connect to esempio@azienda_esempio; if (sqlca.sqlcode != 0) { /*sqlca (SQL Communication Area) è una struttura di dati predefinita che mantiene le informazioni sulla comunicazione tra SQL e programma, sqlcode=0 no errore, altrimenti codice dell’errore*/ printf(“Errore di connessione al DB\n"); } else { exec sql insert into Dipartimento values(:NomeDip,:Id_Dip); /* notare l’uso del : per utilizzare le variabili del programma ospite in SQL*/ exec sql disconnect all; } Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari ESEMPIO in C di SQL statico – prima e dopo … 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; } /* These include files are added by the preprocessor */ #include #include #include #include <ecpgtype.h> <ecpglib.h> <ecpgerrno.h> <sqlca.h> 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"); } 6 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi ESEMPIO 3 DEE - Politecnico di Bari … select Nome, Cognome into :nome_imp, :cognome_imp from Impiegato where CF = :CF_imp; … Finché il risultato di una query è solo un record è tutto semplice 7 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari CURSORI • Quando una query restituisce più tuple è necessario passarle al programma ospite una per volta • Si utilizza un cursore per accedere a tutte le tuple di una interrogazione, accede a tutte le tuple di una interrogazione in modo globale (tutte insieme o a blocchi – è il DBMS che sceglie la strategia efficiente); il cursore passa poi una tupla per volta al programma • Il cursore viene definito su una generica interrogazione mediante la seguente sintassi declare Cursor_Name [scroll ] cursor for SelectSQL [for <read only| update [of attribute,{attribute}]>] Dove, scroll indica che il cursore può muoversi liberamente sul risultato della query, mentre for update indica che il cursore può essere utilizzato in operazioni di aggiornamento permettendo di specificare eventualmente gli attributi oggetto del comando. Si osservi che per riga corrente si considera l’ultima riga letta. 8 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari UTILIZZO DEL CURSORE • Esegue la query: open Cursor_Name • Utilizzo dei risultati (una ennupla alla volta): fetch [position from] Cursor_Name into Variables (accedere alla tupla corrente del risultato o a quella indicata da position e porne i valori nelle variabili del programma ospite) • Position (utilizzabili se l’opzione scroll è stata imposta altrimenti è disponibile solo next) : next (con riferimento a current indica la prossima tupla); prior (tupla precedente); first (prima tupla); last (ultima tupla); absolute integer_value (tupla posizionata al valore ordinale espresso) relative integer_value (tupla posizionata al valore ordinale espresso, rispetto alla posizione corrente) • Accedere alla tupla corrente di un cursore per effettuare un update o un delete (si usa solo nella clausola where e quando la query associata al cursore non esegue un join tra diverse tabelle): es. Delete from NomeTabella where current of Cursor_Name • Chiusura: close cursor Cursor_Name 9 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari ESEMPIO IN C CON UTILIZZO DI CURSORI …… printf(“nome della citta‘?”); scanf(“%s”,&citta[0]); /*creo il cursore*/ EXEC SQL DECLARE P CURSOR FOR SELECT NOME, REDDITO FROM Impiegato WHERE CITTA = :citta for UPDATE of REDDITO; EXEC SQL OPEN P ; /* apro il cursore -> eseguo la query*/ EXEC SQL FETCH P INTO :nome, :reddito ; /*prelevo i dati*/ while (sqlca.sqlcode == 0) { printf(“Qual è l’aumento per %s? ”, nome); scanf(“%d”,&aumento); EXEC SQL UPDATE Impiegato SET REDDITO = REDDITO + :aumento WHERE CURRENT OF P; /*eseguo l’update su current*/ EXEC SQL FETCH P INTO :nome, :reddito; ; /*prelevo i dati per la tupla immediatamente successiva*/ } EXEC SQL CLOSE CURSOR P; } ….. 10 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari DYNAMIC SQL • Non sempre le istruzioni SQL sono note quando si scrive il codice ospite (si pensi, ad esempio, ad un’applicazione che interagisce con utenti). E’ stata introdotta una tecnica completamente diversa, chiamata SQL dinamico, che permette di generare istruzioni SQL a tempo di esecuzione (addirittura ricevute dal programma attraverso parametri o da input). Ovviamente, la tecnica porta ad un degrado delle prestazioni. • Le operazioni in SQL dinamico possono essere eseguite immediatamente oppure prima “preparate” e poi eseguite (anche più volte) • La differenza è che, in SQL statico, i nomi delle relazioni e degli attributi coinvolte nelle istruzioni SQL sono fissate a priori; l’unica parte delle istruzioni che può rimanere non nota a tempo di compilazione è costituita dagli specifici valori da ricercare o da aggiornare. Nell’SQL dinamico, invece, le istruzioni SQL sono generate a tempo di esecuzione; non è quindi necessario specificare relazioni e attributi coinvolti in una istruzione SQL prima della sua esecuzione. 11 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari MODALITÀ DI ESECUZIONE Le operazioni SQL possono essere: • • Esempio: Char * Con esecuzione immediata (in assenza di parametri) SQL_string=“delete from Impiegato execute immediate SQLStatement where CF=27”; … exec sql execute immediate : SQL_string; Con esecuzione differita e ripetibile (anche con parametri): prepare CommandName from SQLStatement execute CommandName [into TargetList][using ParameterList] Esempio: Prepare :trova_nome From “select nome from Impiegato where CF =?” Execute :trova_nome into:nome_imp using :cf_imp Rilascio del comando: Deallocate prepare :trova_nome 12 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari CLI – COME SI UTILIZZANO E’ una Application Programming Interface (API) per accedere ai databases, cioè un insieme di funzioni chiamabili direttamente dal linguaggio di programmazione usato. Il database mette a disposizione una libreria di funzioni, che seguono lo standard CLI. Generalmente vengono usate per applicazioni basate su SQL dinamico. API Oracle Oracle Prog C API Interbase Interbase 13 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari • • • EVOLUZIONE di CLI Utilizza dei driver specifici per ciascun database E’ uno strato software che si interpone tra l’applicazione e i driver specifici del database. Consente quindi ai programmi applicativi di usare query standard SQL, che accederanno al database, senza necessità di conoscere la particolare interfaccia proprietaria. Un modulo del linguaggio di programmazione fornisce una API (serie di funzioni o classi se OO) che permette di interfacciare qualsiasi database tramite un driver specifico per quel database (es. ODBC, JDBC) Driver Oracle Prog JAVA Oracle JDBC API Driver Interbase Interbase 14 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari Implementazioni delle CLI ODBC (Open Database Connectivity): implementazione proprietaria (Microsoft) di SQL/CLI (altra CLI parte di SQL:1999), per accesso a basi di dati relazionali in un contesto eterogeneo e distribuito. Originariamente rilasciata nel 1992, consente di accedere a database di numerosissimi costruttori, inclusi Microsoft (jet, Access, SQLServer); Oracle, IBM, Informix e numerosi altri. JDBC (Java Database Connectivity): è un API Java sviluppata da JavaSoft per eseguire istruzioni SQL e consente ai programmi Java di interagire con qualunque database. Poiché Java gira sulla maggior parte delle piattaforme, JDBC rende possibile scrivere una singola applicazione di database che può girare indifferentemente su piattaforme diverse e interagire con diversi database. JDBC è simile a ODBC ma è progettato apposta per programmi Java mentre ODBC è indipendente dal linguaggio di programmazione. Nello scrivere programmi in Java e usando l’interfaccia JDBC si può usare un prodotto che comprende un "bridge" program JDBC-ODBC per raggiungere database ODBC-accessible. In generale le operazioni richieste sono: caricamento del driver, apertura della connessione con la base di dati, richiesta di esecuzione di istruzioni SQL ed elaborazione dei risultati delle istruzioni SQL 15 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari ODBC e ADO •ODBC è uno strato software che si interpone tra l’applicazione e i driver specifici del database. Consente quindi ai programmi applicativi di usare query standard SQL, che accederanno al database, senza necessità di conoscere la particolare interfaccia proprietaria. •ODBC richiede una certa familiarità di programmazione con le API ed è sostanzialmente procedurale (Scritta in C). Successivamente Microsoft ha introdotto altre due API, questa volta orientate agli oggetti, che vanno sotto il nome di DAO •(Data Access Object) e RDO (Remote Data Object), che sono sostanzialmente interfacce per il motore ODBC. Esse definiscono interfacce ActiveX (originariamente COM Component Object Model). •Più recentemente Microsoft ha introdotto ADO (Active Data Object), basata su una nuova tecnologia di programmazione delle interfacce per DB nota come OLE DB (Object Linking and Embedding for DataBases). •La differenza sostanziale con ODBC è che in questo ogni ogni tipo di DB deve avere una DLL (Dynamic Link Library), un driver ODBC, che viene utilizzata dal motore ODBC per accedere allo specifico DB. In OLE DB is hanno ancora dei driver, ma questi sono implementazioni ActiveX, cioè definizioni di classi che implementano delle interfacce, eliminando così i livelli interposti tra il programma e lo specifico DBMS che si sta utilizzando. •Tipicamente si utilizza per applicazioni web ODBC in congiunzione con ADO. 16 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari Attivazione di una origine dati ODBC N.B. Si suppone la presenza di un database ACCESS •Selezionare Pannello di Controllo •Cliccare su Origine dati ODBC •Selezionare la scheda DSN di sistema ovvero DSN Utente •Cliccare su aggiungi •Selezionare il driver (Microsoft Access) •Inserire nella scheda il nome di riferimento dell'origine dati •Cliccare su Database: Seleziona •Selezionarere Database •Premere OK 17 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari Basi di ADO ADO è composto essenzialmente da tre oggetti primari: Connection Object, Command Object, RecordSet Object: Connection Object è responsabile di raccogliere tutte le informazioni necessarie alla creazione del RecordSet; RecordSet fornisce la struttura atta a contenere i dati e i metodi necessari per accedere ai dati presenti nel RecordSet, tutte le funzionalità dei cursori sono rappresentati nell’interfaccia del RecordSet; Command Object fornisce un secondo metodo per creare un RecordSet, ed è stato esplicitamente progettato per passare i parametri alle stored procedure. 18 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari Un semplice esempio in ASP ‘ Creo un’istanza del componente e la assegno a conn <% set conn=Server.CreateObject("ADODB.Connection") %> ‘ apro la connessione al database mediante una origine dati ODBC <%conn.Open "northwind“, , %> ‘Definisco una query Sqlstring="Select * from Customers" ‘Creo un recordset e gli passo la query: <% Set rs=Server.CreateObject("ADODB.recordset") rs.Open Sqlstring, conn %> ‘Visualizzo i dati estratti: <% for each x in rs.fields response.write(x.name) response.write(" = ") response.write(x.value) next %> <%conn.close%> 19 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari SQL Embedded VS CLI SQL embedded • pemette precompilazione (e quindi efficienza e portabilità del sorgente) • uso di SQL completo • Molto usato in applicazioni legacy CLI • indipendente dal DBMS, uso di funzioni di interazione con i DBMS attraverso Application Programming Interfaces (API) • permette di accedere a più basi di dati, anche eterogenee (senza ricompilazione: portabilità dell’eseguibile): richiede un ulteriore strato di comunicazione esistono drivers specifici per i vari DBMS 20 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari STORED PROCEDURES A partire da SQL-2 è possibile definire procedure dette stored procedures per il fatto che vengono memorizzate all’interno della base di dati come parti dello schema. Le procedure permettono di associare un nome ad una o più istruzioni SQL, con la possibilità di specificare dei parametri da utilizzare per lo scambio di informazioni con la procedura. I vantaggi sono: minor quantità di dati trasferita tra client e server, una più facile manutenibiltà, favorisce il riutilizzo della logica dell’applicazione da parte di utenti diversi, delega all’utilizzo dei diritti di accesso e la possibilità di ottenere in diversi casi un sensibile incremento delle prestazioni. In tal modo però la logica di business risulta in gran parte inglobata nella base di dati. Una volta che la procedura è definita, essa è utilizzabile come se facesse parte dell’insieme dei comandi SQL predefiniti. La procedura può essere invocata avendo cura di associare un valore ai Parametri. procedure Update_address(:cod_dip int, :Addr varchar(60)) Begin; update Department set Address =:Addr where ID_dip =:cod_dip End; Definizione Chiamata exec sql Update_address(:codice,:indirizzo); 21 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari PL/SQL (Procedural Language/SQL) Molti sistemi, e.g Oracle PL/SQL, presentano estensioni ricche e più complesse (ad es. costrutti if – else, cicli while) che rendono SQL un linguaggio computazionalmente completo ossia con lo stesso potere espressivo di un normale linguaggio di programmazione. Noi ci riferiamo a PL/SQL (implementazione Oracle sqlplus ) L’elemento logico base è il blocco: DECLARE /* Declarative section: variables, types, and local subprograms. */ BEGIN /* Executable section: procedural and SQL statements go here. */ /* This is the only section of the block that is required. */ EXCEPTION /* Exception handling section: error handling statements go here. */ END; Per eseguire un programma PL/SQL al testo bisogna far seguire: Una riga con . Una riga con run 22 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi Variabili e Tipi DEE - Politecnico di Bari Una variabile unbound ha sempre valore NULL. Esistono i tipi di SQL, ma anche tipi nuovi, quali Number DECLARE price NUMBER; myBeer VARCHAR(20); Usare %TYPE: DECLARE myBeer Beers.name%TYPE; /* Assegna direttamente a myBeer il tipo di name */ Usare %ROWTYPE per definire record strutturati: DECLARE beerTuple Beers%ROWTYPE; Assegnare valori DECLARE a NUMBER := 3; BEGIN a := a + 1; END; . run; 23 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi Un semplice esempio DEE - Politecnico di Bari CREATE TABLE T1(e INTEGER, f INTEGER ); INSERT INTO T1 VALUES(1, 3); INSERT INTO T1 VALUES(2, 4); /* Above is plain SQL; below is the PL/SQL program. */ DECLARE a NUMBER; b NUMBER; BEGIN SELECT e,f INTO a,b FROM T1 WHERE e>1; INSERT INTO T1 VALUES(b,a); END; . run; Si noti l’obbligo della keyword INTO 24 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari Flusso di controllo: IF IF <condition> THEN <statement_list> ELSE <statement_list> END IF; la parte ELSE è opzionale. Si può fare multiway branch: IF <condition_1> THEN ... ELSIF <condition_2> THEN ... ... ... ELSIF <condition_n> THEN ... ELSE ... END IF; Esempio: DECLARE a NUMBER; b NUMBER; BEGIN SELECT e,f INTO a,b FROM T1 WHERE e>1; IF b=1 THEN INSERT INTO T1 VALUES(b,a); ELSE INSERT INTO T1 VALUES(b+10,a+10); END IF; END; . run; 25 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari Flusso di controllo: Cicli LOOP <loop_body> /* A list of statements. Inclusivi di un EXIT WHEN <condition>;*/ END LOOP; Esempio: DECLARE i NUMBER := 1; BEGIN LOOP INSERT INTO T1 VALUES(i,i); i := i+1; EXIT WHEN i>100; END LOOP; END; Esistono anche: WHILE <condition> LOOP <loop_body> FOR <var> IN <start>..<finish> LOOP 26 END LOOP; <loop_body> Utilizzare SQL nelle applicazioni END LOOP; E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari Basic I/O DECLARE emp_count NUMBER; BEGIN SELECT count(*) INTO emp_count FROM employees WHERE department_id = &department_id; END; Produrrà in esecuzione: Enter value for department_id: 13 •Stampare a video: DBMS_OUTPUT.PUT_LINE(‘hello world’ || emp_count); 27 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari Usare i cursori 1) DECLARE /* Declare output variables to hold the result of the query: */ 2) a T1.e%TYPE; 3) b T1.f%TYPE; /* Cursor declaration: */ 4) CURSOR T1Cursor AS 5) SELECT e, f 6) FROM T1 7) WHERE e < f 8) FOR UPDATE; 9) BEGIN 10) OPEN T1Cursor; 11) LOOP /*Retrieve each row of the result of the above query into PL/SQL variables:*/ 12) FETCH T1Cursor INTO a, b;/* If there are no more rows to fetch, exit the loop*/ 13) EXIT WHEN T1Cursor%NOTFOUND; /* Delete the current tuple: */ 14) DELETE FROM T1 WHERE CURRENT OF T1Cursor; /* Insert the reverse tuple: */ 15) INSERT INTO T1 VALUES(b, a); 16) END LOOP; /* Free cursor used by the query. */ 17) CLOSE T1Cursor; 18) END; 19) . 20) run; 28 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari Stored procedures in PL/SQL CREATE TABLE T2 ( a INTEGER, b CHAR(10)); Dichiarazione di una stored procedure: CREATE|REPLACE PROCEDURE proc_name(var_name IN|OUT|INOUT Data_type) AS|IS Esempio: CREATE PROCEDURE addtuple1(i IN NUMBER) AS BEGIN INSERT INTO T2 VALUES(i, 'xxx'); END addtuple1; . run; Esecuzione: BEGIN addtuple1(99); END; . run; Eliminazione: DROP PROCEDURE <proc_name> 29 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari Stored Procedures in PL/SQL CREATE PROCEDURE addtuple2(x IN T2.a%TYPE, y IN T2.b%TYPE) AS BEGIN INSERT INTO T2(a, b) VALUES(x, y); END addtuple2; . run; •Esecuzione BEGIN addtuple2(10, 'abc'); END; . run; 30 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari Stored Procedures in PL/SQL CREATE TABLE T3 ( a INTEGER, b INTEGER); CREATE PROCEDURE addtuple3(a IN NUMBER, b OUT NUMBER) AS BEGIN b := 4; INSERT INTO T3 VALUES(a, b); END; . run; Eseguiamo la procedura: DECLARE v NUMBER; BEGIN addtuple3(10, v); END; . run; 31 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari Funzioni • Le funzioni vengono trattate analogamnete alle procedure: CREATE FUNCTION <func_name>(<param_list>) RETURN <return_type> AS ... .. RETURN <expression> 32 Utilizzare SQL nelle applicazioni E. Di Sciascio Sistemi Informativi DEE - Politecnico di Bari Procedura di iscrizione al programma Oracle Academy Visitare la pagina principale di Oracle Academy - sezione Advanced Computer Science (https://oai.oracle.com/en/index1.html) Seguire il link nel menu di sinistra: Apply for Student Membership Selezionare il paese (Italy) e quindi procedere con Continue Presa visione delle caratteristiche del contratto, scaricare la versione stampabile del contratto di licenza Oracle Academy (link Versione Stampabile), poi procedere con Continua Si aprirà un motore di ricerca: digitare nel campo di ricerca Politecnico di Bari Quindi seguire il link sul campo Politecnico di Bari e selezionare Dipartimento Di Elettrotecnica ed Elettronica A questo punto sarà richiesto di inserire le informazioni di accounting (Nome, Cognome, indirizzo di posta elettronica e password). Alla termine dell’inserimento cliccate su Invia Domanda Nel momento in cui la registrazione sarà stata autorizzata da noi, sarà possibile accedete alla pagina https://oai.oracle.com/pls/oai/oai_login.home, inserendo user name e password. Per accedere agli strumenti oracle basta cliccare nel menu di sinistra su oracle.com e quindi spostarsi nella sezione download. 33 Utilizzare SQL nelle applicazioni E. Di Sciascio