PL SQL
PL SQL
Introduzione a PL/SQL
LaBADAM
LaBADAM
Testo di riferimento
Scott Urmann,
“PL/SQL Programming”,
ORACLE PRESS
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 1
Corso Basi di Dati 2004
Introduzione (1)
PL/SQL è un sofisticato linguaggio di
programmazione utilizzato per accedere ad
un database ORACLE
LaBADAM
LaBADAM
Introduzione (2)
PL/SQL colma il gap tra
la tecnologia dei DB ed
… i linguaggi procedurali
PL/SQL usa:
Le facilities di ORACLE RDBMS
Estende SQL:
Insert, delete, update
Looping, branching
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 2
Corso Basi di Dati 2004
LaBADAM
LaBADAM
Vantaggi
Procedural Capabilities
Improved Performance
Enhanced Productivity
Portabilità
Integrazione con il Relational DBMS
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 3
Corso Basi di Dati 2004
Prestazioni
Modello Client/server
+ istruzioni SQL possono essere mandati al
DBMS
Riduzione dei tempi di comunicazione tra
l’applicazione ed il RDBMS
Raggruppamento di statement SQL ed invio,
come unica unità, al DBMS
SQL
IF..THEN
Application SQL DBMS
ELSE
SQL
LaBADAM
LaBADAM
Caratteristiche di PL/SQL
PL/SQL ha diverse caratteristiche e
funzionalità.
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 4
Corso Basi di Dati 2004
Esempio di codice
DECLARE
Num_in_stock NUMBER(5);
BEGIN
SELECT quantity INTO num_in_stock
FROM inventory_table
WHERE product = ‘TENNIS RACQUET’
IF num_in_stock > 0 THEN
UPDATE inventory_table SET quantity=quantity-1
WHERE product = ‘TENNIS RACQUET’
ELSE
INSERT INTO purchase_record
VALUES (‘OUT OF TENNIS RACQUET.’, SYSDATE)
END IF;
COMMIT;
END;
LaBADAM
LaBADAM
Blocchi PL/SQL
DECLARE
DECLARATIONS
BEGIN
Executable STATEMENTS
EXCEPTION
Exception handlers
END;
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 5
Corso Basi di Dati 2004
Sezione Dichiarativa
La sezione dichiarativa è quella sezione dove
tutte le variabili, cursori e tipi utilizzati sono
dichiarati.
LaBADAM
LaBADAM
Sezione Esecutiva
La sezione esecutiva è dove si trovano le
istruzioni del blocco da eseguire
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 6
Corso Basi di Dati 2004
LaBADAM
LaBADAM
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 7
Corso Basi di Dati 2004
TIPI DI BLOCCO
L’unità base di ogni programma PL/SQL è un blocco.
Tutti i programmi PL/SQL sono costituiti da blocchi
che possono essere in ordine sequenziale o innestati
l’uno nell’ altro
LaBADAM
LaBADAM
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 8
Corso Basi di Dati 2004
Procedure e Funzioni
CREATE PROCEDURA ProvaIns AS
DECLARE
Nome VARCHAR2(50):=‘Pippo’;
BEGIN
INSERT INTO Prova (nome)
VALUES (Nome);
END;
LaBADAM
LaBADAM
Trigger
CREATE OR REPLACE TRIGGER Provatr
BEFORE INSERT OF nome
ON Prova
FOR EACH ROW
DECLARE
cont NUMBER(5);
info VARCHAR2(100):=‘TableSpace Esaurito’;
BEGIN
SELECT COUNT (nome)
INTO cont
FROM Prova;
EXCEPTION
WHEN cont>50
INSERT INTO Log (msg)
VALUES(info);
END;
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 9
Corso Basi di Dati 2004
Commenti
Come in ogni linguaggio, anche in PL/SQL è possibile
documentare il codice mediante linee di commento
LaBADAM
LaBADAM
Attraverso la sintassi:
DECLARE Codice NUMBER(10);
si definisce una variabile “Codice” di tipo numerico
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 10
Corso Basi di Dati 2004
LaBADAM
LaBADAM
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 11
Corso Basi di Dati 2004
COMPOSITE TYPES
TABLE
RECORD
BOOLEAN FAMILY
BOOLEAN
LaBADAM
LaBADAM
%TYPE e %ROWTYPE
In molti casi una variabile PL/SQL sarà utilizzata per
manipolare dati memorizzati nel DB
Title bookinfo.booktitle%TYPE
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 12
Corso Basi di Dati 2004
DECLARE
SUBTYPE Contatore IS NUMBER (4);
cont Contatore;
LaBADAM
LaBADAM
Record
I record PL/SQL sono simili ai tipi “struct”
del linguaggio C. Un record permette di
trattare variabili diverse come un’unica unità.
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 13
Corso Basi di Dati 2004
Esempio di record
DECLARE
TYPE ImpiegatoRecord IS RECORD (
CF NUMBER (20);
Nome VARCHAR2(50);
Cognome VARCHAR2(50);
);
ImpiegatoRecord impiegato;
Impiegato.Nome=‘Pippo’;
ImpiegatoRecord Impiegato%ROWTYPE;
LaBADAM
LaBADAM
Tabelle
Le tabelle PL/SQL sono simili agli array in C. Esse vengono trattate
come array, anche se sono implementate in maniera differente.La
sintassi per la definizione di una tabella è la seguente:
Esempio:
TYPE Char_Table IS TABLE OF VARCHAR2(10)
INDEX BY BINARY_INTEGER;
CHAR_TABLE table;
table(1)=‘Primo’;
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 14
Corso Basi di Dati 2004
Tabelle di Record
TYPE Impiegato_Table IS TABLE OF
Impiegato%ROWTYPE
INDEX BY BINARY_INTEGER;
Impieagato_Table Impiegato_app;
Impiegato_app(1).Nome=‘Pippo’;
LaBADAM
LaBADAM
DELETE
Cancella le righe di una tabella
EXISTS
Ritorna il valore vero se la entry specifica esiste nella tabella
FIRST
Ritorna l’indice della prima riga nella tabella
LAST
Ritorna l’indice dell’ ultima riga nella tabella
NEXT
Ritorna l’indice della riga nella tabella successiva a quella
specificata
PRIOR
Ritorna l’indice della riga nella tabella precedente a quella
specificata
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 15
Corso Basi di Dati 2004
Funzioni:
TO_CHAR
TO_DATE
TO_NUMBER
LaBADAM
LaBADAM
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 16
Corso Basi di Dati 2004
Assegnazione
1) operatore di assegnazione “ :=“
Es.
Tax := price * tax_rate;
Bonus := current_salary * 0.10
2) clausola INTO
Es.
Select sal INTO current_salary FROM emp
WHERE ename = ‘SMITH’
LaBADAM
LaBADAM
Operatori di confronto
Numeriche
Tra stringhe
Tra date
Es.
A<7
2*a = b
Name != ‘COMPUTER’
Name1 < name 2
Birthdate < ’05-JUL-59’
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 17
Corso Basi di Dati 2004
LaBADAM
LaBADAM
Selezione
IF, THEN, ELSIF, ELSE …. END IF:
DECLARE
Acc_bal NUMBER(11,2);
ACCT CONSTANT NUMBER(2) := 3;
DEBIT_AMT CONSTANT NUMBER(5,2) := 500.00;
BEGIN
Select bal INTO Acc_bal FROM accounts
Were account_id = ACCT;
IF acc_bal >= DEBIT_AMT THEN
UPDATE accounts DET bal = bal – DEBIT_AMT
WHERE account_id = ACCT;
ELSE
INSERT INTO temp VALUES
(ACCT, acc_bal, ‘Insufficient funds.’);
END IF;
END;
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 18
Corso Basi di Dati 2004
Loop
PL/SQL supporta differenti tipi di costrutti
iterativi:
Loop semplici
LOOP
istruzioni
EXIT [WHEN CONDITION]
END LOOP;
Loop FOR
FOR loop_counter IN [REVERSE]
low_bound..highbound LOOP
istruzioni
END LOOP;
Loop WHILE
WHILE condition LOOP
istruzioni
END LOOP;
LaBADAM
LaBADAM
DECLARE
contatore BINARY_INTEGER:=1;
BEGIN
LOOP
INSERT INTO Prova (id)
values(contatore);
contatore=contatore+1;
EXIT WHEN contatore>10;
END LOOP;
END;
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 19
Corso Basi di Dati 2004
DECLARE
contatore BINARY_INTEGER;
BEGIN
FOR contatore IN 1..10 LOOP
INSERT INTO
Prova(id)values(contatore);
END LOOP;
END;
LaBADAM
LaBADAM
GOTO
PL/SQL utilizza, per il controllo del flusso di
un blocco, anche l’istruzione: GOTO label
DECLARE
contatore BINARY_INTEGER:=1;
BEGIN
LOOP
INSERT INTO
Prova(id)values(contatore);
contatore:=contatore+1;
IF contatore>10 THEN
GOTO label_endloop;
END IF
END LOOP;
<<label_endloop>>
END;
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 20
Corso Basi di Dati 2004
SQL in PL/SQL
PL/SQL dà la possibilità di inserire all’interno
di un blocco un qualsiasi statement SQL:
DML
Insert, Delete, Select, Update
DDL
Create Table, Create Index, etc…
LaBADAM
LaBADAM
SELECT
DECLARE
Impiegato_Record Impiegato%ROWTYPE;
BEGIN
SELECT *
INTO Impieagto_Record
FROM Impiegato
WHERE id=1;
END;
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 21
Corso Basi di Dati 2004
INSERT e DELETE
BEGIN
INSERT INTO IMPIEGATO
(CF,Nome,Cognome) VALUES
(‘a’,’b’,’c’);
DELETE FROM IMPIEGATO WHERE
CF=‘a’ AND Nome=‘b’ AND
Cognome=‘c’;
END;
LaBADAM
LaBADAM
CURSORI
Quando una query ritorna una tabella
contenente un certo numero di righe, si può
definire un cursore per
Elaborare tutte le righe tornate dalla query
Tenere traccia di quale riga è attualmente in
elaborazione
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 22
Corso Basi di Dati 2004
LaBADAM
LaBADAM
CURSOR STATEMENTS
DECLARE CURSOR
Permette di definire un cursore e di
specificare la query
OPEN
Inizializza il cursore
FETCH
Serve a recuperare la riga corrente
Viene eseguito ripetutamente fino a che non
si sono individuate tutte le righe
CLOSE
Chiusura del cursore
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 23
Corso Basi di Dati 2004
LaBADAM
LaBADAM
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 24
Corso Basi di Dati 2004
LaBADAM
LaBADAM
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 25
Corso Basi di Dati 2004
esempio
DECLARE
Result temp.col1%TYPE;
CURSOR c1 IS
SELECT n1, n2m n3 FROM data_table
WHERE exper_num = 1;
BEGIN
FOR c1_rec IN c1 LOOP
result := c1_rec.n2/(c1_rec.n1+c1_rec.n3);
INSERT INTO temp VALUES (result, NULL,
NULL);
END LOOP;
COMMIT;
END;
LaBADAM
LaBADAM
Il cursore IMPLICITO
Oracle apre implicitamente un cursore per elaborare
qualsiasi statement SQL.
PL/SQL permette di riferirlo come “SQL%”
Non è possibile usare OPEN, FETCH e CLOSE su
SQL%
Attributi:
SQL%NOTFOUND è TRUE se INSERT,UPDATE,
DELETE non hanno inficiato nessuna riga
SQL%FOUND …
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 26
Corso Basi di Dati 2004
LaBADAM
LaBADAM
Transaction Processing
Una transazione è una sequenza di istruzioni SQL che ORACLE
tratta come una unità
Tutti i cambiamenti sono
Resi permanenti oppure
Undone
PL/SQL permette l’uso di
COMMIT
rende permanenti i cambiamenti fatti durante la
transazione corrente
ROLLBACK
Termina la transazione e annulla ogni cambiamento fatto fin
dall’inizio della transazione
SAVEPOINT
Marca il punto corrente nell’elaborazione di una transazione
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 27
Corso Basi di Dati 2004
Funzioni SQL
Numeric
Character
Date
Group Æ non può essere usato in espressioni
PL/SQL
Data conversion
LaBADAM
LaBADAM
PREDICATI
PL/SQL permette un accesso pieno a tutti i
predicati PL/SQL
I predicati sono usati nelle clausole WHERE
Si possono usare tutti gli operatori di
confronto, compreso
BETWEEN
IS NULL
LIKE
EXISTS
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 28
Corso Basi di Dati 2004
LaBADAM
LaBADAM
Embedded SQL
•select che producano una sola ennupla e
operazioni di aggiornamento possono
essere immerse senza problemi (con
opportuno meccanismo di trasmissione dei
risultati)
esiste di solito una variabile di sistema
sqlcode che dopo l'esecuzione di
un'operazione assume valore zero se essa
ha avuto successo e valore diverso
altrimenti
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 29
Corso Basi di Dati 2004
Esempio PASCAL
write('nome della citta''?');
readln(citta);
EXEC SQL DECLARE P CURSOR FOR
SELECT NOME, REDDITO
FROM PERSONE
WHERE CITTA = :citta ;
EXEC SQL OPEN P ;
EXEC SQL FETCH P INTO :nome, :reddito ;
while SQLCODE = 0
do begin
write('nome della persona:', nome, 'aumento?');
readln(aumento);
EXEC SQL UPDATE PERSONE
SET REDDITO = REDDITO + :aumento
WHERE CURRENT OF P
EXEC SQL FETCH P INTO :nome, :reddito
end;
EXEC SQL CLOSE CURSOR P
LaBADAM
LaBADAM
Esempio C
void VisualizzaStipendiDipart(char NomeDip[])
{
char Nome[20], Cognome[20];
long int Stipendio;
$ declare ImpDip cursor for
select Nome, Cognome, Stipendio
from Impiegato
where Dipart = :NomeDip;
$ open ImpDip;
$ fetch ImpDip into :Nome, :Cognome, :Stipendio;
printf("Dipartimento %s\n",NomeDip);
while (sqlcode == 0)
{
printf("Nome e cognome dell'impiegato: %s
%s",Nome,Cognome);
printf("Attuale stipendio: %d\n",Stipendio);
$ fetch ImpDip into :Nome, :Cognome, :Stipendio;
}
$ close cursor ImpDip;
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 30
Corso Basi di Dati 2004
LaBADAM
LaBADAM
Esempio Pro*C
#include <stdio.>
EXEC SQL BEGIN DECLARE SECTION;
varchar empname[11];
int salary;
…
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE SQLCA;
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 31
Corso Basi di Dati 2004
Esempio
main()
…..
EXEC SQL WHENEVER SQLERROR GOTO
err;
EXEC SQL CONNECT :uid IDENTIFIED
BY:pwd;
printf(“connected!\n”);
for(;;)
<codice c>
……
LaBADAM
LaBADAM
esempio
….
/*inizio del blocco PL/SQL */
EXEC SQL EXECUTE
BEGIN
….. Codice PL/SQL
END;
END-EXEC;
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 32
Corso Basi di Dati 2004
Dynamic SQL
Quando un applicazione non conosce a tempo di
compilazione lo statement SQL da eseguire, occorre
il “dynamic SQL.
Major problem:
Gestione del passaggio dei parametri tra il
programma e l’ambiente SQL
Esecuzione diretta:
execute immediate SQLStatement
•Esecuzione preceduta dall’analisi di uno
prepare CommandName from SQLStatement
Seguito da:
execute CommandName [ into TargetList ]
LaBADAM
LaBADAM
Procedure
SQL-2 permette la definizione di procedure
anche note come “stored procedure”
Le stored procedures sono parte dello
Schema relazionale
procedure AssignCity(:Dep char(20), :City char(20))
update Department
set City = :City
where Name = :Dep
SQL-2 non permette la gestione di
procedure complesse
….. Ma in ORACLE possiamo usare PL/SQL
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 33
Corso Basi di Dati 2004
LaBADAM
LaBADAM
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 34
Corso Basi di Dati 2004
Esempio di procedura
Di seguito viene riportato il codice PL/SQL di
una procedura per l’inserimento di un nuovo
impiegato
CREATE [OR REPLACE] PROCEDURE MyInsert(
CF_in IN Impiegato.CF%TYPE,
Nome_in IN Impiegato.Nome%TYPE,
Cognome_in IN Impieagto.Cognome%TYPE) AS
BEGIN
INSERT INTO Impiegato (CF,Nome,Cognome)
VALUES (CF_in,Nome_i,Cognome_in);
COMMIT;
END MyInsert;
BEGIN
MyInsert(‘MGBVFVB55YTGFRG’,’Pippo’,’Baudo’);
END;
LaBADAM
LaBADAM
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 35
Corso Basi di Dati 2004
BEGIN
MyInsert(‘MGBVFVB55YTGFRG’,’Pippo’,’Baudo’);
END;
LaBADAM
LaBADAM
Package
Funzioni e procedure possono essere raccolte
in package
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 36
Corso Basi di Dati 2004
TRIGGER in PL/SQL
Un TRIGGER è una routine PL/SQL
Che viene eseguita quando si verifica un particolare
evento
Es.
Movimento del cursore da/in un campo, record,
blocco
Modifica del contenuto di un campo
LaBADAM
LaBADAM
Esempio di Trigger
CREATE [OR REPLACE] Trigger_name
[BEFORE|AFTER] triggering_event
ON Table_Reference
[FOR EACH ROW [WHEN Trigger_condition]]
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 37
Corso Basi di Dati 2004
Tipi di Trigger
LaBADAM
LaBADAM
Quelli di informatica -
www.quellidiinformatica.tk 38