PL/SQL: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Funzionalità collegamenti suggeriti: 2 collegamenti inseriti.
 
(48 versioni intermedie di 38 utenti non mostrate)
Riga 1:
{{Linguaggio di programmazione
Il '''PL/SQL (Procedural <nowiki>Language/Structured</nowiki> Query Language)''' è un [[linguaggio di programmazione]] proprietario per database, [[Oracle Corporation]], procedurale, server-based ed estensione dell'[[SQL]].
|nome = PL/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 (linguaggio)|Ada]].
|immagine = <!-- Solo nome file -->
|didascalia =
|autore = [[Oracle Corporation]]
|data = [[1991]]
|versione =
|utilizzo = [[query language|linguaggio di interrogazione]] per [[database]] <!-- Ambito di utilizzo specifico: linguaggio general-purpose, interrogazione database, ecc. -->
|paradigmi = [[Programmazione procedurale]] <!-- Programmazione procedurale, a oggetti, generica, ecc. -->
|tipizzazione = [[Tipizzazione forte|Forte]] <!-- Forte, debole... -->
|specifiche =
|estensione = <!-- Estensioni comuni dei file sorgenti -->
|influenzato_da = [[Pascal (linguaggio di programmazione)|Pascal]], [[Ada (linguaggio di programmazione)|Ada]]<!-- Lista di linguaggi che hanno influenzato il linguaggio in esame, citare le fonti -->
|ha_influenzato = <!-- Lista di linguaggi influenzati dal linguaggio in esame, citare le fonti -->
 
|implementazione_riferimento = <!-- Implementazione di riferimento: compilatore o interprete? -->
==Funzionalità==
|sistema_operativo = [[multipiattaforma]] <!-- S.O. supportati dall'impl. di riferimento -->
|lingua = <!-- Lingue supportate dall'impl. di riferimento -->
|licenza = [[Software proprietario|proprietaria]] <!-- Licenza del codice sorgente o binario dell'impl. di riferimento -->
|sito_web =
}}
 
In [[informatica]] il '''PL/SQL''' ('''Procedural Language/Structured Query Language''') è un [[linguaggio di programmazione]] proprietario (per [[database]] di [[Oracle Corporation]]), [[Programmazione procedurale|procedurale]], server-based, estensione dell'[[SQL]].<ref>{{Cita web |url=https://www.oracle.com/it/database/technologies/appdev/plsql.html |titolo=PL/SQL eredita robustezza, sicurezza e portabilità dei database |accesso=1 novembre 2024}}</ref> Linguaggi simili al PL/SQL sono inclusi in altri [[database management system]] SQL. La [[sintassi]] è fortemente simile a quella del linguaggio di programmazione [[Ada (linguaggio)|Ada]].
Il PL/SQL supporta le [[variabile|variabili]], [[condizioni]], e gestisce le [[eccezioni]]. Le implementazioni dalla versione 8 di [[Oracle]] [[RDBMS]] hanno messo enfasi su l'[[object orientation | object-orientation]].
 
==Funzionalità==
 
Il PL/SQL supporta le [[variabile (informatica)|variabili]], condizioni, e gestisce le [[Eccezione (informatica)|eccezioni]]. Le implementazioni dalla versione 8 di [[Oracle Database|Oracle]] [[RDBMS]] hanno messo enfasi su l'[[Programmazione orientata agli oggetti|object-orientation]].
Le funzioni SQL sottostanti sono come programmi dichiarativi.
Il linguaggio SQL standard &mdash;diversamente da alcuni linguaggi di programmazione funzionali&mdash; non richiede implementazioni per convertire le chiamate ricorsive in salti.
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 inline in modo esplicito alle funzioni PL/SQL, o possono lanciare triggers PL/SQL in caso di predefiniti eventi [[Data Manipulation Language]] (DML).
 
Le funzioni SQL sottostanti sono come programmi dichiarativi. Il linguaggio SQL standard - diversamente da alcuni linguaggi di programmazione funzionali - non richiede implementazioni per convertire le chiamate ricorsive in salti.cSQL non fornisce prontamente i puntatori alla "prima riga" e al "resto della tabella", e non può eseguire facilmente costrutti come cicli.
<!--
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 complesso package per il codice SQL dinamico (<code>DBMS_SQL</code>) nel quale il sistema doveva parsare esplicitamente ed eseguire il SQL statement. Le ultime versioni hanno incluso una sintassi <code>EXECUTE IMMEDIATE</code> chiamata "Native Dynamic SQL" che semplifica il problema. Qualsiasi uso di DDL in Oracle può risultare un esplicito commit. I programmatori possono usare anche lo SQL dinamico per eseguire DML quando non conoscono in anticipo l'esatto contenuto dello statement.
-->
 
Il PL/SQL invece, come un linguaggio procedurale [[Turing equivalenza|Turing-complete]], permette agli sviluppatori dei [[database]] Oracle di interfacciarsi con il sottostante database in maniera imperativa. Gli statements SQL possono effettuare chiamate inline in modo esplicito alle funzioni PL/SQL, o possono lanciare triggers PL/SQL in caso di predefiniti eventi [[Data Manipulation Language]] (DML).
<p><p> Il PL/SQL ha diversi packages predefiniti, i più importanti sono:
<p> DBMS_OUTPUT - per le operazioni di output
<P> DBMS_JOBS - per far lanciare specifiche procedure o funzioni ad un particolare tempo, ad esempio lo scheduling
<P> DBMS_XPLAN - per formattare un output "Explain Plan"
<P> DBMS_SESSION
<P> DBMS_METADATA
 
Il PL/SQL ha diversi packages predefiniti, i più importanti sono:
* <code>DBMS_OUTPUT</code>- per le operazioni di output
* <code>DBMS_JOBS</code>- per far lanciare specifiche procedure o funzioni ad un particolare tempo, ad esempio lo scheduling
* <code>DBMS_XPLAN</code>- per formattare un output "Explain Plan"
* <code>DBMS_SESSION</code>
* <code>DBMS_METADATA</code>
 
<p> In ogni release di Oracle RDBMS, la Oracle Corporation aggiunge packages contenenti nuove funzionalità.
 
== Struttura base del codice ==
 
I programmi '''PL/SQL''' sono strutturati a blocchi. I blocchi hanno questa forma generale:
:{|
|<font style="color:#0000FF">declare</font>
|-
|&nbsp;&nbsp;&nbsp;&nbsp;<font style="color:#006400">-- Blocco di dichiarazione (opzionale)</font>
|-
|<font style="color:#0000FF">begin</font>
|-
|&nbsp;&nbsp;&nbsp;<font style="color:#006400">-- Codice da eseguire</font>
|-
|<font style="color:#0000FF">exception
|-
|&nbsp;&nbsp;&nbsp;<font style="color:#006400">-- Gestione eccezioni(opzionale)</font>
|-
|<font style="color:#0000FF">end;</font>
|}
 
<syntaxhighlight lang="plsql">
:<font style="color:#006400">/* Esempi di commenti</font>
declare
-- Blocco di dichiarazione (opzionale)
begin
-- Codice da eseguire
exception
-- Gestione eccezioni(opzionale)
end;
 
/* Esempi di commenti
:<font style="color:#006400">multilinea.. */</font>
multilinea.. */
--commento su singola linea
</syntaxhighlight>
 
La sezione<code>DECLARE</code>specifica i [[Tipo di dato|tipi di dato]] delle variabili, delle costanti, delle collezioni e i tipi definiti dall'utente.
:<font style="color:#006400">--commento su singola linea</font>
 
Il blocco tra <code>BEGIN</code> ed <code>END</code> specifica il codice da eseguire.
<p>La sezione DECLARE specifica i tipi di dato delle variabili, delle costanti, delle collezioni e i tipi definiti dall'utente.
 
<p>Il blocco tra BEGIN ed END specifica il codice da eseguire.
<p>Le eccezioni possono essere di due tipi:
# eccezioni predefinite
# eccezioni definite dall'utente.
 
<p> I programmatori possono lanciare le eccezioni definite dall'utente in modo esplicito con il commando RAISE:
I programmatori possono lanciare le eccezioni definite dall'utente in modo esplicito con il commando <code>RAISE</code>:
RAISE <nome dell'eccezione>
 
<p> L'Oracle Corporation ha predefinito numerose eccezioni, ad esempio NO_DATA_FOUND, TOO_MANY_ROWS, etc.
<syntaxhighlight lang="plsql">RAISE <nome_dell_eccezione></syntaxhighlight>
Ogni eccezione ha un SQL Error Number e un SQL Error Message associato. I programmatori possono accedere a questi dati con le funzioni SQLCODE e SQLERRM.
 
L'Oracle Corporation ha predefinito numerose eccezioni, ad esempio NO_DATA_FOUND, TOO_MANY_ROWS, ecc.
Ogni eccezione ha un SQL Error Number e un SQL Error Message associato. I programmatori possono accedere a questi dati con le funzioni <code>SQLCODE</code> e <code>SQLERRM</code>.
 
== Variabili ==
 
La sezione <code>DECLARE</code> definisce le variabili, ed eventualmente le inizializza. Se non inizializzate avranno il loro valore di default, ad esempio null o zero.
 
Per esempio:
 
<syntaxhighlight lang="plsql">
:{|
declare
|<font style="color:#0000FF">declare</font>
numero1 number(2);
|-
numero2 number(2) := 17;
|&nbsp;&nbsp;&nbsp;&nbsp;numero1 <font style="color:#FF0000">number</font><font style="color:#0000FF">(</font><font style="color:#8B4513">2</font><font style="color:#0000FF">);</font>
testo varchar2(12) := 'Ciao Mondo';
|-
begin
|&nbsp;&nbsp;&nbsp;&nbsp;numero2 <font style="color:#FF0000">number</font><font style="color:#0000FF">(</font><font style="color:#8B4513">2</font><font style="color:#0000FF">) := </font><font style="color:#FF0000">17</font><font style="color:#0000FF">;</font>
select numero_civico into numero1 from indirizzi where nome='Mario';
|-
end;
|&nbsp;&nbsp;&nbsp;&nbsp;testo <font style="color:#FF0000">varchar2</font><font style="color:#0000FF">(</font><font style="color:#8B4513">12</font><font style="color:#0000FF">) := </font><font style="color:#FF0000">'Ciao Mondo'</font><font style="color:#0000FF">;</font>
</syntaxhighlight>
|-
|<font style="color:#0000FF">begin</font>
|-
|&nbsp;&nbsp;&nbsp;&nbsp;<font style="color:#0000FF">select numero_civico into</font> numero1 <font style="color:#0000FF">from</font> <font style="color:#B8860B"> indirizzi </font><font style="color:#0000FF">where nome=</font><font style="color:#FF0000">'Mario'</font><font style="color:#0000FF">;</font>
|-
|<font style="color:#0000FF">end;</font>
|}
 
Il simbolo <nowikicode>:=</nowikicode>= funziona come un [[operatore di assegnamento]], per memorizzare un valore in una variabile.
 
<p> I tipi di dato più usati sono <code>NUMBER</code>, <code>INTEGER</code>, <code>VARCHAR2</code>, <code>DATE</code>, <code>TIMESTAMP</code> etcecc.
 
=== Variabili Numerichenumeriche ===
<syntaxhighlight lang="plsql">nome_variabile number(P,[S]) := valore;</syntaxhighlight>
nome_variabile <font style="color:#FF0000">number</font><font style="color:#0000FF">(</font><font style="color:#8B4513">P,[S]</font><font style="color:#0000FF">) := </font><font style="color:#FF0000">valore</font><font style="color:#0000FF">;</font>
 
Per definire una variabile numerica il programmatore può usare il tipo NUMBER.
In questo caso è anche possibile definire la precisione (P) e la scala (S). La precisione indica quanti numeri saranno utilizzati per rappresentare il numero. La scala indica quanti numeri sono decimali. Per esempio, 3,1416 è composto da una precisione 5 e una scala 4.
 
Per definire una variabile numerica il programmatore può usare il tipo <code>NUMBER</code>.
In questo caso è anche possibile definire la precisione (P) e la scala (S). La precisione indica quante cifre saranno utilizzate per rappresentare il numero. La scala indica quante di quelle cifre sono decimali. Per esempio, 3,1416 è composto da una precisione 5 e una scala 4.
 
Altri tipi numerici abbastanza comuni sono
:<font style="color:#FF0000"code>dec, decimal, double precision, integer, int, numeric, real, smallint, binary_integer, pls_integer</fontcode>
 
=== Variabili testuali ===
<syntaxhighlight lang="plsql">nome_variabile varchar2(L) := 'Testo';</syntaxhighlight>
nome_variabile <font style="color:#FF0000">varchar2</font><font style="color:#0000FF">(</font><font style="color:#8B4513">L</font><font style="color:#0000FF">) := </font><font style="color:#FF0000">'Testo'</font><font style="color:#0000FF">;</font>
 
Per definire una variabile di tipo testuale, si può usare il tipo VARCHAR2, con eventualmente tra parentesi il numero massimo di caratteri.
 
Per definire una variabile di tipo testuale, si può usare il tipo <code>VARCHAR2</code>, con eventualmente tra parentesi il numero massimo di caratteri.
 
Altri tipi di variabile testuale includono:
:<font style="color:#FF0000"code>varchar, char, long, raw, long raw, nchar, nchar2</fontcode>
 
=== Variabili booleane ===
<syntaxhighlight lang="plsql">nome_variabile boolean := true;</syntaxhighlight>
nome_variabile <font style="color:#FF0000">boolean</font><font style="color:#0000FF"></font><font style="color:#0000FF">:= </font><font style="color:#FF0000">true</font><font style="color:#0000FF">;</font>
 
Le variabili booleane possono avere i seguenti valori <code>TRUE</code>, <code>FALSE</code> o <code>NULL</code>.
 
=== Variabili temporali ===
<syntaxhighlight lang="plsql">nome_variabile date := '01-Gen-2005';</syntaxhighlight>
nome_variabile <font style="color:#FF0000">date </font><font style="color:#0000FF"></font><font style="color:#0000FF">:= </font><font style="color:#FF0000">'01-Gen-2005'</font><font style="color:#0000FF">;</font>
 
I programmatori possono definire una variabile di tipo data usando il tipo <code>DATE</code>.
 
Il DBMS Oracle fornisce la funzione "<code>to_date"</code> per convertire le stringhe in date.
Ad esempio: <syntaxhighlight lang="''plsql">to_date('31-12-2004','dd-mm-yyyy'))''"</syntaxhighlight>
 
Per convertire le date in testo si può usare la funzione "<code>to_char ( date, format_string )</code>.
 
=== Tipi di dati per specifiche colonne ===
Nome_variabile <fontsyntaxhighlight stylelang="color:#B8860Bplsql">Nome_variabile nome_tabella</font><font style="color:#0000FF">.</font>nome_colonna<font style="color:#0000FF">%type;</fontsyntaxhighlight>
 
Questa sintassi definisce una variabile dello stesso tipo della colonna a cui si riferisce nella dichiarazione.
Line 129 ⟶ 134:
I programmatori possono definire tipi di dato con la seguente sintassi:
 
''<syntaxhighlight lang="plsql">type data_type is record(field_1 type_1 :=xyz, field_2 type_2 :=xyz, ..., field_n type_n :=xyz);"''</syntaxhighlight>
Per esempio:
 
<syntaxhighlight lang="plsql">
:{|
declare
|<font style="color:#0000FF">declare</font>
type t_indirizzo is record(
|-
nome indirizzi.nome%type,
|&nbsp;&nbsp;&nbsp;&nbsp;<font style="color:#0000FF">type</font> t_indirizzo <font style="color:#0000FF">is record(</font>
via indirizzi.via%type,
|-
numero_civico indirizzi.numero_civico%type,
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nome <font style="color:#B8860B">indirizzi</font><font style="color:#0000FF">.</font>nome<font style="color:#0000FF">%type,</font>
codice_postale indirizzi.codice_postale%type);
|-
v_indirizzo t_indirizzo;
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;via <font style="color:#B8860B">indirizzi</font><font style="color:#0000FF">.</font>via<font style="color:#0000FF">%type,</font>
begin
|-
select nome, via, numero_civico, codice_postale into v_indirizzo from indirizzi where rownum = 1;
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numero_civico <font style="color:#B8860B">indirizzi</font><font style="color:#0000FF">.</font>numero_civico<font style="color:#0000FF">%type,</font>
end;
|-
</syntaxhighlight>
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;codice_postale <font style="color:#B8860B">indirizzi</font><font style="color:#0000FF">.</font>codice_postale<font style="color:#0000FF">%type);</font>
|-
|&nbsp;&nbsp;&nbsp;&nbsp;v_indirizzo t_indirizzo;
|-
|<font style="color:#0000FF">begin</font>
|-
|&nbsp;&nbsp;&nbsp;&nbsp;<font style="color:#0000FF">select</font> nome, via, numero_civico, codice_postale <font style="color:#0000FF">into</font> v_indirizzo <font style="color:#0000FF">from</font> <font style="color:#B8860B">indirizzi</font> <font style="color:#0000FF">where rownum =</font> <font style="color:#8B4513">1</font></font>;
|-
|<font style="color:#0000FF">end;</font>
|}
 
Questo semplice programma definisce il proprio tipo di dato, ''<code>t_indirizzo''</code>, il quale contiene dei campi ''<code>nome</code>, <code>via</code>, <code>numero_civico''</code> e ''<code>codice_postale''</code>.
 
Usando questi tipi di dato il programmatore ha definito una variabile chiamata ''<code>v_indirizzo''</code> ed ha prelevato il suo valore dalla tabella <code>INDIRIZZI</code>.
 
I programmatori possono richiamare i singoli attributi, come in una struct, attraverso la dot-notation, ad esempio:
 
''<syntaxhighlight lang="plsql">v_indirizzo.via := 'Via Rossi';"''</syntaxhighlight>
 
Il PL/SQL permette anche di definire classi e instanziarle come oggetti, questo lo rende simile ai linguaggi di programmazione orientati agli oggetti. In PL/SQL una classe è chiamata Advance Data Type (ADT), è definita come un tipo SQL Oracle, diversamente dai tipi definiti dall'utente, permettendo di usarli sia in SQL che in PL/SQL. Il costruttore e i metodi sono scritti in PL/SQL. L'oggetto può essere salvato in una colonna di database Oracle.
 
==Linguaggi simili==
Anche altri DBMS hanno dei linguaggi associati. [[Sybase SQL Server|Sybase]] e il suo derivato [[Microsoft SQL Server]] hanno [[Transact-SQL]], [[PostgreSQL]] ha [[PL/pgSQL]] (che cerca di emulare PL/SQL), [[IBM DB2|DB2]] include SQL Procedural Language<ref>{{cita ([httpweb |url=https://publib.boulderwww.ibm.com/infocenterdocs/db2helpen/indexdb2/11.jsp1?topic=/com.ibm.db2.udb.doc/ad/c0011916.htmdata-sql-pl-support |titolo=SQL Procedural Language (SQL PL]) |accesso=1 novembre 2024}}</ref> e [[MySQL]] ha una versione di SQL molto simile a PL/SQL.
 
PL/SQL assomiglia da vicino al [[Pascal (linguaggio)|Pascal]]. La struttura a packages alla struttura base del Pascal, o alle unità [[Delphi]].
 
==Note==
Il PL/SQL permette anche di definire classi e instanziarle come oggetti, questo lo rende simile ai linguaggi di programmazione orientati agli oggetti. In PL/SQL una classe è chiamata Advance Data Type (ADT), è definita come un tipo SQL Oracle, diversamente dai tipi definiti dall'utente, permettendo di usarli sia in SQL che in PL/SQL. Il costruttore e i metodi sono scritti in PL/SQL. L'oggetto può essere salvato in una colonna di database Oracle.
<references/>
 
==Bibliografia==
* {{Cita libro|autore=Steven Feuerstein|autore2=Bill Pribyl|titolo=Oracle PL/SQL programming|anno=2002|url=https://archive.org/details/oracleplsqlprogr00feue|edizione=3ª ed.|data=2002|editore=O'Reilly Media|ISBN=978-0-596-00381-4}}
* [http://www.postgresql.org/docs/8.0/interactive/plpgsql.html PL/pgSQL - SQL Procedural Language]
 
* Steven Feuerstein (2002). ''Oracle PL/SQL Programming'', 3rd ed. O'Reilly & Associates. ISBN 0596003811. (Many consider this book the "bible" of PL/SQL development)
==Collegamenti esterni==
* [http://www.orafaq.com/faqplsql.htm Oracle PL/SQL FAQ]
* {{Collegamenti esterni}}
* [http://dev.mysql.com/doc/refman/5.0/en/stored-procedures.html MySQL Stored Procedures and Functions]
* {{cita web|url=https://www.postgresql.org/docs/8.0/interactive/plpgsql.html|titolo=PL/pgSQL - SQL Procedural Language|lingua=en}}
*[http://freeitsolutions.com/oracle-tutorials/?category=pl_sql PL/SQL Tutorials] (en)
* {{cita web|url=http://www.orafaq.com/wiki/PL/SQL_FAQ|titolo=Oracle PL/SQL FAQ|lingua=en}}
* {{cita web|url=https://dev.mysql.com/doc/refman/5.0/en/stored-routines.html|titolo=MySQL Stored Procedures and Functions|lingua=en}}
 
{{Controllo di autorità}}
[[Categoria:Database]]
{{Portale|informatica}}
 
[[Categoria:Linguaggi di interrogazione]]
[[ca:PL/SQL]]
[[Categoria:Linguaggi di programmazione]]
[[cs:PL/SQL]]
[[de:PL/SQL]]
[[en:PL/SQL]]
[[es:PL/SQL]]
[[fr:PL/SQL]]
[[he:PL/SQL]]
[[hu:PL/SQL]]
[[ja:PL/SQL]]
[[ko:PL/SQL]]
[[nl:PL/SQL]]
[[pl:PL/SQL]]
[[pt:PL/SQL]]
[[ro:PL/SQL]]
[[ru:PL/SQL]]
[[sk:PL/SQL]]
[[sv:PL/SQL]]
[[tg:PL/SQL]]
[[th:PL/SQL]]
[[tr:PL/SQL]]
[[uk:PL/SQL]]