giovedì 19 marzo 2015

Oracle e PL-SQL

Vai all'indice

Finora negli esempi proposti ho utilizzato per comodità JavaDB (una versione di Apache Derby) un database leggero presente all’interno della JDK. Tuttavia sviluppando applicazioni "Enterprise" è opportuno utilizzare una base di dati più performante e completa. In quest'ottica Oracle può essere una delle scelte migliori. Dal sito della Oracle è possibile scaricare la versione 11g Express, l'edizione gratuita e più leggera del prodotto. Una volta eseguita l'istallazione è possibile dialogare con Oracle tramite la console operativa SQLPLUS semplicemente accedendo al prompt e digitando il comando:
sqlplus "/ as sysdba".
Uno degli aspetti più interessanti di Oracle è la possibilità di scrivere veri e propri programmi utilizzando PL/SQL un linguaggio di programmazione procedurale che mette a disposizione, oltre a tutti i costrutti dell'SQL, anche i controlli condizionali, i cicli iterativi, la gestione delle variabili e delle costanti, la gestione delle eccezioni, delle procedure, delle funzioni, ecc.
Un concetto fondamentale del PL/SQL è quello di blocco al cui interno è possibile combinare logicamente i vari comandi SQL nonché i vari costrutti "accessori" messi a disposizione dal PL/SQL. Di seguito riporto un esempio pratico di programma PL/SQL.

       
CREATE OR REPLACE PROCEDURE cursore
IS
BEGIN
DECLARE
   c_id utente.id%type;
   c_nome utente.nome%type;
   c_cognome utente.cognome%type;
   CURSOR c_utente is
      SELECT id, nome, cognome FROM utente;
BEGIN
   OPEN c_utente;
   LOOP
      FETCH c_utente into c_id, c_nome, c_cognome;
      EXIT WHEN c_utente%notfound;
      dbms_output.put_line(c_id || ' ' || c_nome || ' ' || c_cognome);
   END LOOP;
   CLOSE c_utente;
EXCEPTION
   WHEN no_data_found THEN
      dbms_output.put_line('Nessun utente trovato!');
   WHEN others THEN
      dbms_output.put_line('Errore generico!');
END;
END;
/


Il blocco di codice definisce un cursore ovvero un costrutto che permette di gestire le tuple restituite dall'esecuzione di una query. Il risultato finale è la stampa a video dei campi Id, Nome e Cognome della tabella Utente.
Nella sezione DECLARE definisco il cursore e le variabili con lo stesso tipo del campo definito in tabella Utente. Nel corpo della procedura apro il cursore e definisco un ciclo che estrae i campi direttamente nelle variabili definite in precedenza nella declare, quindi terminato il ciclo chiudo il cursore. Nella sezione Exception inserisco 2 codici predefiniti che intercettano e stampano a video un messaggio in caso di errori generici o di utente non trovato.
Per eseguire il programma appena descritto riapro SQLPLUS e creo la tabella Utente con la stessa struttura già vista diverse volte in questo blog.

  
-- Nota: mai creare i propri oggetti nel SYS schema.
SQL> CREATE TABLE Utente("ID" NUMBER(*,0) NOT NULL ENABLE, "NOME" VARCHAR2(30), "COGNOME" VARCHAR2(30), "RUOLO" VARCHAR2(30), PRIMARY KEY ("ID"));


Inserisco il codice del programma PL/SQL in un file di testo che chiamo cursore.sql. Col seguente comando eseguo la creazione della Stored Procedure.
SQL> @C:/pathdelfile/cursore.sql;
Se la creazione è andata a buon fine il processo restituisce il messaggio "Procedure created." , quindi eseguo il programma:
SQL> exec cursore();
Se il processo termina correttamente vedremo a video la lista degli utenti.
Hai apprezzato questo post? Conferma le mie competenze o scrivi una segnalazione sul mio profilo Linkedin!

Nessun commento:

Posta un commento