Sei sulla pagina 1di 38

Corso Basi di Dati 2004

Introduzione a PL/SQL

GRUPPO di BASI DI DATI


MULTIMEDIALI

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

Un programma PL/SQL risiede sul Database


Sever:
„ In tal modo il codice PL/SQl può essere
elaborato velocemente ed efficientemente

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

Relazione tra SQL e PL/SQL


PL/SQL estende SQL corredandolo con le
caratteristiche tipiche dei linguaggi procedurali,
come :
„ Definizione di Variabili e Tipi
„ Strutture di controllo come (IF..THEN..ELSE), EXIT,
GOTO, statement e costrutti iterativi
(FOR…LOOP/WHILE….LOOP)
„ Definizione di Procedure e Funzioni

PL/SQL integra così la potenza e la flessibilità di


SQL con i costrutti tipici di un linguaggio procedurale

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à.

L’unità base in PL/SQL è il “blocco”.

Tutti i programmi PL/SQL sono costituiti da


blocchi suddivisi in sezioni

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.

In PL/SQL la dichiarazione di una variabile


assume una forma del tipo:
nomevar tipovar [COSTANT ] [NOTNULL] [:= valore]

LaBADAM
LaBADAM

Sezione Esecutiva
La sezione esecutiva è dove si trovano le
istruzioni del blocco da eseguire

Sia gli statement SQL che quelli procedurali


risiedono in tale sezione

Della struttura a blocco precedentemente


osservata solo la sezione esecutiva è
richiesta; la sezione dichiarativa e quella di
gestione degli errori sono opzionali

LaBADAM
LaBADAM

Quelli di informatica -
www.quellidiinformatica.tk 6
Corso Basi di Dati 2004

Sezione per la gestione delle eccezioni


La sezione di “handling” delle eccezioni del
blocco viene utilizzata per rispondere a run-
time ad eventuali errori che si incontrano
durante il programma

Il codice di questa sezione non è eseguito a


meno che non si verifica l’errore

LaBADAM
LaBADAM

Esempio di Cattura dell’errore


DECLARE
Error_code NUMBER(5);
Error_msg VARCHAR2(200);
User VARCHAR2(50);
Error_info VARCHAR2 (100);
BEGIN

EXCEPTION
WHEN OTHERS THEN
Error_code:=SQLCODE;
Error_msg:=SQLERRM;
User:=USER;
Error_info=‘Errore rilevato il ‘ || TO_CHAR
(SYSDATE)
|| ‘dall’utente ‘|| User;
INSERT INTO log_table (code,message,info) VALUES
(Error_code,Error_msg,Error_info);
END;

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

Ci sono differenti tipi di blocco


„ Blocchi Anonimi e con Nome
‡ Generalmente costruiti dinamicamente e utilizzati
una sola volta, differiscono per la presenza di una
label che fornisce al blocco un nome
„ Sottoprogrammi
‡ procedure o funzioni
„ Triggers
‡ Sono blocchi con nome memorizzati nel DB che sono
eseguiti a valle di un evento

LaBADAM
LaBADAM

Blocchi Anonimi e con Nome


1) Anonimo
DECLARE
Nome VARCHAR2(50):=‘Pippo’;
BEGIN
INSERT INTO Prova (nome)
VALUES (Nome);
END;
2) Con Nome
<<prova>>
DECLARE
Nome VARCHAR2(50):=‘Pippo’;
BEGIN
INSERT INTO Prova (nome)
VALUES (Nome);
END;

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

Tale linee sono ignorate dal motore di compilazione

Ci sono due stili di commento:


„ Single-line
-- Questo è un commento
„ Multi-line
/*commento*/

LaBADAM
LaBADAM

Variabili e Tipi (1)


Le informazioni sono trasmesse da un’applicativo
PL/SQL e il DB server per mezzo di “variabili”.

Le variabili sono dichiarate all’interno delle sezione


dichiarativa di un blocco PL/SQL

Il “Tipo” definisce il dominio di appartenza di una


variabile

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

Variabili e Tipi (2)


PL/SQL supporta inoltre tipi definiti
dall’utente, tabelle e record

DECLARE Impiegato IS RECORD (


CF NUMBER (20);
Nome VARCHAR2(50);
Cognome VARCHAR2(50);
);

LaBADAM
LaBADAM

TIPI DI PL/SQL (1)


NUMERIC FAMILY
„ NUMBER
„ DEC
„ DECIMAL
„ DOUBLE PRECISION
„ REAL
„ INTEGER
„ INT
„ SMALLINT
„ BYNARY_INTEGER
„ NATURAL
„ POSITIVE
CHARACTER FAMILY
„ VARCHAR
„ VARCHAR2
„ CHAR
„ CHARACTER
„ LONG

LaBADAM
LaBADAM

Quelli di informatica -
www.quellidiinformatica.tk 11
Corso Basi di Dati 2004

TIPI DI PL/SQL (2)


DATE FAMILY
„ DATE

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

Se si vuole usare come tipo di dato il tipo usato nella definizione


di un attributo di una tabella del DB …
….. Si può usare l’attributo %TYPE

Title bookinfo.booktitle%TYPE

dove bookinfo è il nome di una tabella e booktitle il nome di un


attributo

%ROWTYPE è utile per dichiarare una variabile di tipo record


che ha la stessa struttura di una riga in una tabelle o in una
vista
„ ….usato per un fetch da un cursore

LaBADAM
LaBADAM

Quelli di informatica -
www.quellidiinformatica.tk 12
Corso Basi di Dati 2004

TIPI DEFINITI DALL’UTENTE


Un tipo definito dall’utente o subtype è un
tipo PL/SQL basato su tipi esistenti

All’interno del programma PL/SQL un subtype


assume la valenza di un vero e proprio tipo

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à.

TYPE record_type IS RECORD (


field1 type1[NOT NULL];
field2 type2 [NOT NULL];
...
);

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’;

Nel caso esiste una tabella Impiegato con gli stessi


campi del record:

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:

TYPE MyTable IS TABLE OF ELEMENTS_TYPE


INDEX BY INDEX_TYPE;
MyTable table;
Table.attribute;

L’accesso agli elementi avviene mediante table(index)

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

Attributi delle Tabelle


COUNT
„ Ritorna i numero di righe nella tabella

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

CONVERSIONE TRA TIPI


PL/SQL mette a disposizione dell’utente
funzioni per la conversione tra variabili
appartenenti a tipi diversi

Funzioni:
„ TO_CHAR
„ TO_DATE
„ TO_NUMBER

LaBADAM
LaBADAM

PL/SQL Built-in Functions


PL/SQL mette in realtà a disposizione una
vasta gamma di funzioni a supporto del
programmatore:

„ Funzioni per la gestione di caratteri e


stringhe
„ Funzioni numeriche e Matematiche
„ Etc…

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

PL/SQL: Strutture di Controllo


Così come avviene nei linguaggi procedurali,
PL/SQL presenta una varietà di strutture di
controllo le quali permettono, appunto, il
“controllo” del comportamento del blocco in
esecuzione.

Tali strutture includono:


„ Statement condizionali
„ Loop

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

Costrutti Iterativi: Esempi (1)


Il seguente blocco è usa un loop semplice per inserire
i numeri da 1 a 10 nella tabella Prova:

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

Costrutti Iterativi: Esempi (2)


Il seguente blocco è usa un loop FOR per inserire i
numeri da 1 a 10 nella tabella Prova:

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

Relazioni e record: cursori

problema fondamentale: “disadattamento di


impedenza”
„ i linguaggi tradizionali gestiscono record
uno alla volta
„ SQL produce insiemi di ennuple
soluzione: cursore
„ accede a tutte le ennuple di una
interrogazione in modo globale
„ le trasmette al programma una alla volta

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

Attributi per i cursori


Ogni cursore definito esplicitamente ha 4
attributi
„ Cursor_name%NOTFOUND
‡ Ha valore TRUE se l’ultimo FETCH è fallito –
finite le righe
„ Cursor_name%FOUND
‡ Opposto di NOTFOUND: vero se ci sono ancora
righe
„ Cursor_name%ROWCOUNT
‡ Ritorna il numero di righe FETCHED
„ Cursor_name%ISOPEN
‡ Ha valore TRUE se un certo cursore è aperto,
FALSE se è chiuso

LaBADAM
LaBADAM

Esempio con i cursore


DECLARE
num1 data_table.n1%TYPE;
num2 data_table.n2%TYPE;
num3 data_table.n3%TYPE;
Result temp.col1%TYPE;
CURSOR c1 IS
SELECT n1,n2, n3 FROM
data_table
WHERE exper_num = 1;

LaBADAM
LaBADAM

Quelli di informatica -
www.quellidiinformatica.tk 24
Corso Basi di Dati 2004

Esempi con i cursore (cont--)


BEGIN
OPEN c1;
LOOP
FETCH c1 INTO num1,num2,num3;
EXIT WHEN c1%NOTFOUND;
Result := num2/(num1+num3);
INSERT INTO temp VALUES (result, NULL, NULL);
END LOOP
CLOSE c1;
COMMIT;
END;

LaBADAM
LaBADAM

FOR LOOPS con Cursori


Permette implicitamente di
„ aprire un cursore
„ Fetch-are ogni riga
„ Chiudere il cursore quando tutte le righe
sono state elaborate
I CURSOR FOR LOOPS ritornano i dati come
campi di un record

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 …

‡ SQL%ROWCOUNT ritorna il numero di righe


inficiate da una op.
‡ SQL%ISOPEN è sempre a FALSE –cursore implicio

LaBADAM
LaBADAM

Quelli di informatica -
www.quellidiinformatica.tk 26
Corso Basi di Dati 2004

Supporto per SQL


Transaction processing
Functions
Predicates

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

SQL immerso in linguaggio ospite


"embedded SQL"
in applicazioni complesse, è spesso
necessario “immergere” istruzioni SQL in
programmi tradizionali (Pascal, COBOL, C,
C++, Java)
i programmi con SQL immerso sono
analizzati da precompilatori che traducono
le istruzioni SQL
le variabili del programma possono essere
usate come parametri nelle istruzioni SQL
(precedute da ':')

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

PL/SQL con APPLICATION


DEVELOPMENT TOOLS
ORACLE Precompilers
„ Permette di inserire blocchi di PL/SQL in
programmi scritti in altri linguaggi (host
languages)
‡ Ada, C, COBOL, FORTRAN, PASCAL, PL/1
„ I precompilatori trattano un blocco PL/SQL
come una singola istruzione SQL embedded

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

Procedure e Funzioni in PL/SQL


Le procedure e funzioni in PL/SQL sono molto simili a
quelli dei linguaggi procedurali di terza generazione

Procedure e Funzioni sono anche note col nome di


sottoprogrammi

Procedure e funzioni non sono altro che blocchi


PL/SQL che è possibile attivare mediante una
chiamata a procedura o funzione

Come in altri linguaggi ogni procedura e funzione può


essere dotata di parametri di I/O da scambiare con
l’esterno

LaBADAM
LaBADAM

Creazione di una Procedura


La sintassi generale per la creazione di una
procedura in PL/SQL è la seguente:

CREATE [OR REPLACE] PROCEDURE procedure_name


[(
Argument[{IN|OUT|IN OUT}] type,

Argument[{IN|OUT|IN OUT}] type,
)] {AS|IS}
Procedure_body

Il corpo di una procedura non è altro che un


blocco PL/SQL

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

Creazione di una funzione


Una funzione è molto simile ad una procedura.
In più essa ritorna un valore alla fine della
sua esecuzione
CREATE [OR REPLACE] FUNCTION MyCheck
RETURN BOLEAN IS
DELCLARE
cont NUMBER(5);
BEGIN
SELECT count(*)
INTO cont
FROM Impiegato;
IF cont>50
RETURN FALSE;
ELSE
RETUTN TRUE;
END MyCheck;

LaBADAM
LaBADAM

Quelli di informatica -
www.quellidiinformatica.tk 35
Corso Basi di Dati 2004

Esempio di procedure e funzioni


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
IF !(MyCheck) THEN
INSERT INTO Impiegato (CF,Nome,Cognome)
VALUES (CF_in,Nome_i,Cognome_in);
COMMIT;
END IF;
END MyInsert;

BEGIN
MyInsert(‘MGBVFVB55YTGFRG’,’Pippo’,’Baudo’);
END;

LaBADAM
LaBADAM

Package
Funzioni e procedure possono essere raccolte
in package

CREATE [OR REPLACE] PACKAGE package_name {AS|IS}


procedure_specificaron |
function_specification |
variable_declaration |
type defintion |
Exception declaration |
cursor_declaration |
END [package_name];

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

‡ Inserimenti, cancellazioni, aggiornamenti

‡ Tasti funzione premuti dall’operatore

I TRIGGER sono spesso utilizzati per preservare


l’integrità dei dati a velle di operzioni sul DB

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

Categoria Valori Commenti

Statement Insert, Delete, Definisce il tipo di


istruzione DML che
Update scatena il Trigger

Timing Before o After Definisce quando si


scatena il trigger

Level Riga o Se il trigger è al livello di


riga esso si scatena per
Statement ogni riga affetta dal
“triggering statement”

LaBADAM
LaBADAM

Quelli di informatica -
www.quellidiinformatica.tk 38