PL/SQL
Il PL/SQL (Procedural Language/Structured Query Language) è un linguaggio di programmazione per database proprietario, Oracle Corporation, procedurale, server-based ed estensione dell'SQL. Linguaggi simili al PL/SQL sono inclusi in altri database management system SQL. La sua sintassi è fortemente simile a quella del linguaggio di programmazione ADA.
Funzionalità
Il PL/SQL supporta le variabili, conditions, e gestisce le eccezioni. Le implementazioni dalla versione 8 di Oracle RDBMS hanno menso enfasi su l' object-orientation.
Le funzioni SQL sottostanti sono come programmi dichiarativi. L'SQL standard —diversamente da alcuni linguaggi di programmazione funzionali— non richiede implementazioni per convertire le chiamate ricorsive in salti. L'SQL non fornisce prontamente i puntatori alla "prima riga" e al "resto della tabella", e non può eseguire facilmente costrutti come cicli. Il PL/SQL invece, com un linguaggio procedurale Turing-complete, permette agli sviluppatori dei database Oracle di interfacciarsi con il sottostante database in maniera imperativa. Gli statements SQL possono effettuare chiamate in line in modo esplicito alle funzioni PL/SQL, o possono lanciare triggers PL/SQL in caso di predefiniti eventi DML.
Dato che i programmatori possono incorporare statements SQL DML nel PL/SQL (una definizione di cursore, per esempio, o usare la sintassi SELECT .. INTO), statements DDL come CREATE TABLE-DROP INDEX etc.. è richiesto l'uso dell' "SQL Dinamico". Le prime versioni di Oracle richiedevano l'uso di un clomplesso package per l'SQL dinamico (DBMS_SQL
) nel quale il sistema doveva parsare esplicitamente ed eseguire l'SQL statement. Le ultime versioni hanno incluso una sintassi EXECUTE IMMEDIATE
chiamata "Native Dynamic SQL" che semplifica il problema. Qualsiasi uso di DDL in Oracle può risultare un esplicito commit. I programmatori possono usare anche l'SQL dinamico per eseguire DML quando non conoscono in anticipo l'esatto contenuto dello statement.
Il PL/SQL ha diversi packages predefiniti, i più importanti sono:
DBMS_OUTPUT - per le operazioni di output
DBMS_JOBS - per far lanciare specifiche procedure o funzioni ad un particolare tempo, ad esempio lo scheduling
DBMS_XPLAN - per formattare un output "Explain Plan"
DBMS_SESSION
DBMS_METADATA
In ogni release dell'Oracle DBMS, la Oracle Corporation aggiunge packages.
Struttura base del codice
I programmi PL/SQL consiste di blocchi. I blocchi hanno questa forma generale:
declare -- Blocco di dichiarazione (optional) begin -- Proprietà del programma exception -- Gestione eccezioni(opzionale) end;
- /* Esempi di commenti
- multilinea... */
- --commento su singola linea
La sezione DECLARE specifica i tipi di dato della variabili, delle costanti, delle collezioni e i tipi definiti dall'utente.
Il blocco tra BEGIN ed END specifica il codice da eseguire.
Le eccezioni possono essere di due tipi:
- eccezioni predefinite
- eccezioni definite dall'utente.
I pogrammatori possono lanciare le eccezioni definite dall'utente in modo esplicito, possono farlo con il commando RAISE: RAISE <nome dell'eccezione>
L'Oracle Corporation ha predefinito numerose eccezioni, ad esempio NO_DATA_FOUND, TOO_MANY_ROWS, etc. Ogni eccezione ha un SQL Error Number e un SQL Error Messaggio associato. I programmatori possono accedere a questi dati con le funzioni SQLCODE e SQLERRM.
Variabili
La sezione DECLARE definisce le variabili, ed eventualmente le inizializza. Se non inizializzate avranno il loro valore di default, ad esempio null o zero.
Per esempio:
declare number1 number(2); number2 number(2) := 17; text varchar2(12) := 'Hello world'; begin select street_number into number1 from address where name='Smith'; end;
Il simbolo := funziona come un operatore di assegnamento, per memorizzare un valore in una variabile.
I tipi di dato più usati sono NUMBER, INTEGER, VARCHAR2, DATE, TIMESTAMP etc.
Variabili Numeriche
nome_variabile number(P[,S]) := value;
Per definire una variabile numerica, il programmatore usa il tipo NUMBER. In questo caso è anche possibile definire la precizione (P) o la scala (S).
Altri tipi numerici abbstanza comuni sono
- dec, decimal, double precision, integer, int, numeric, real, smallint, binary_integer, pls_integer
Variabili testuali
nome_variabile varchar(L) := 'Text';
Per definire una variabile testuale, si può usare il tipo VARCHAR2, con eventualmente tra parentesi il numero massimo di caratteri.
ALtri tipi di variabile testuale includono:
- varchar, char, long, raw, long raw, nchar, nchar2
Variabili booleane
nome_variabile boolean:= true;
Le variabili booleane possono avere i seguenti valori TRUE, FALSE o NULL.
Variabili temporali
variable_name date := '01-Jan-2005';
I programamtori possono definire una variabile di tipo data usando il tipo DATE. Il DBMS Oracle fornisce la funzione "to_date" per convertire le stringhe in date. Ad esempio: "to_date('31-12-2004','dd-mm-yyyy'))"
Per convertire le date in testo si può usare la funzione "to_char ( date_string, format_string ).
Tipi di dati per specifiche colonne
Nome_variabile nome_tabella.nome_colonna%type;
Questa sintassi definisce una variabile dello stesso tipo della colonna a cui si riferisce nella dichiarazione.
Tipi dato definiti dall'utente
I programmatori possono definire tipi di dato con la seguente sintassi:
"type data_type is record(field_1 type_1 :=xyz, field_2 type_2 :=xyz, ..., field_n type_n :=xyz);"
Per esempio:
declare type t_address is record( name address.name%type, street address.street%type, street_number address.street_number%type, postcode address.postcode%type); v_address t_address; begin select name,street, street_number, postcode into v_address from address where rownum = 1; end;
Uesto semplice programma definisce i propri tipi di dato, chiamati t_address, i quali contengono dei campi name, street, street_number e postcode.
Ussando questi tipi di dato il programmatore ha definito una variabile chiamata v_address e ha caricato il suo vaolre dalla tabella ADDRESS.
I programmatori possono richiamare i singol iattributi, come in una struct, attraverso la dot-notation, ad esempio:
"v_address.street := 'High Street';"