PL/SQL: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
WP:SINTASSI: formattazione
Funzionalità collegamenti suggeriti: 2 collegamenti inseriti.
 
(46 versioni intermedie di 37 utenti non mostrate)
Riga 1:
{{Linguaggio di programmazione
Il '''PL/SQL (Procedural Language/Structured 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 [[Eccezione (informatica)|eccezioni]]. Le implementazioni dalla versione 8 di [[Oracle]] [[RDBMS]] hanno messo enfasi su l'[[Programmazione orientata agli oggetti|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.
 
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.
Il PL/SQL invece, com 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).
 
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).
<!--
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 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>
 
In ogni release di Oracle RDBMS, la Oracle Corporation aggiunge packages contenenti nuove funzionalità.
Line 27 ⟶ 42:
== 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.
La sezione DECLARE specifica i tipi di dato delle 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:
Line 58 ⟶ 66:
# eccezioni definite dall'utente.
 
I programmatori possono lanciare le eccezioni definite dall'utente in modo esplicito con il commando <code>RAISE</code>:
 
<syntaxhighlight lang="plsql">RAISE <nome_dell_eccezione></syntaxhighlight>
<code>RAISE <nome dell'eccezione></code>
 
L'Oracle Corporation ha predefinito numerose eccezioni, ad esempio NO_DATA_FOUND, TOO_MANY_ROWS, etcecc.
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 <code>:=</code> funziona come un [[operatore di assegnamento]], per memorizzare un valore in una variabile.
 
I tipi di dato più usati sono <code>NUMBER</code>, <code>INTEGER</code>, <code>VARCHAR2</code>, <code>DATE</code>, <code>TIMESTAMP</code> etcecc.
 
=== Variabili numeriche ===
<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 <code>NUMBER</code>.
In questo caso è anche possibile definire la precisione (P) e la scala (S). La precisione indica quantiquante numericifre saranno utilizzatiutilizzate per rappresentare il numero. La scala indica quantiquante numeridi 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 <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 132 ⟶ 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:
 
<codesyntaxhighlight lang="plsql">v_indirizzo.via := 'Via Rossi';</codesyntaxhighlight>
 
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>[http{{cita web |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]].
 
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.
 
==Note==
Line 177 ⟶ 170:
 
==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]]
[[zh:PL-SQL]]