Upload
phungquynh
View
219
Download
3
Embed Size (px)
Citation preview
1
Oracle - PL/SQL
• Introduzione ad Oracle
• PL/SQL: Elementi di base
• Tecniche di programmazione– uso delle variabili
– uso dei cursori
– uso delle funzioni/procedure
– I/O
Oracle: Prodotti
• SQL*Plus - Interprete di comandi come DDL,DML.
• Developer/2000 and Developer. Suite di tool disviluppo– Oracle*Forms - Data entry e manipulation a schermo
– Oracle*Reports - Tool di gestione dei report
– Oracle*Graphics - Tool grafico per la sintesi dei dati(charts e grafici)
• Oracle*Book - Tool grafico per lo sviluppo on-line di documentazione ipertestuale
2
Oracle: Prodotti
• SQL*TextRetrieval and Oracle Context - Unasuite di strumenti e API per la ricercabibliografica.
• Programmer/2000 - include Pro * precompilatorie librerie di procedure e programmi di util ita’ peril linking ̀ `C' ' , C++, FORTRAN, Java, ADA,COBOL che garantiscono l’accesso agli OracleDB
Oracle: Utilities
• Enterprise Manager - Tool grafico di gestione diuna Base Dati.
• SQL*Loader - Caricatore di dati esternni (ASCIIo binary) in un Oracle DB.
3
Oracle: Connectivity e Middleware
• SQL*Net e Net8 - Driver di comunicazione chesupporta accesso client-server dei tool ad unOracle DB
• ORACLE Server - Parte di un DBMS Oracle chee’ attivo su un database server: riceve richieste damacchine client e le trasmette all’ Oracle RDBMSe viceversa.
• Oracle ODBC Drivers - Open DataBaseConnectivity drivers per la connessione deidatabase Oracle in accordo con lo standardODBC
Core Database Engine
– ORACLE RDBMS• Oracle Web Applications Server - WWW (HTTP)
Server collegato all’Oracle RDBMS.
• Spatial Data Cartridge (GIS), Video Cartridge
• ConText Cartridge - Provides storage and retrievalof text documents.
• OLAP Option - On-Line Analytical Processing
• Objects Option (OO features)
– Integrated Data Dictionary.
– SQL e PL/SQL
4
Oracle: Ambienti di sviluppo
• Sviluppo di applicazioni Oracle:– Oracle RDBMS (o un Oracle RDBMS server),
– uno o piu’ tool di sviluppo.
– Tool di sviluppo esterni (PowerBuilder, Visual Basicor Java Appl Dev).
• Sviluppo stand-alone (Personal Oracle o PersonalOracle Lite RDBMS + Oracle Developer)
• Sviluppo Multi-user (in ambiente condiviso):Oracle RDBMS server su macchina server, clientidistribuiti su PCs.
PL/SQL: Elementi di Base
• Login
Host String:per Personal Oracle8 beq-local.
5
PL/SQL: Elementi di Base
• Attivazione
PL/SQL:Obbiettivi
• Inserire, modificare, cercare ed invocarecomandi SQL
• Accedere alle definizioni di tabelle, colonnee dati
• Formattare, effettuare calcoli, memorizzaree stampare i risultati di interrogazioni
• Accedere e copiare dati tra Oracle DBdiversi
6
Comando CREATE
CREATE TABLE impiegato
(nome VARCHAR2(8),
cognome VARCHAR2(8),
cf VARCHAR2(9) NOT NULL,
salary NUMBER(7) NOT NULL,
supercf VARCHAR2(9),
deptno NUMBER(1) NOT NULL) ;
Domini, Tipi di Dato
• VARCHAR2– caratteri , taglia variabile, max=4,000
• NUMBER– Numerici, NUMBER(precision, scale) con
NUMBER(6,2) in [-999.99, 999.99].
• DATE– data e ora, TO_DATE(), TO_CHAR().
• RAW - binary data. <=255 char, 1 solo attrLARGE RAW (<= 2 Gb) per tabella
• LOB, BLOB e CLOB
7
Comando DESCRIBESQL> CREATE TABLE imp_dip_1
AS SELECT nome, cognome
FROM impiegato
WHERE deptno = 1 ;
Table created.
SQL> DESCRIBE imp_dip_1
Name Null? Type
-------------------------- -------- ----
NOME VARCHAR2(8)
COGNOME VARCHAR2(2)
Ouput
• Formattazione dell ’output
co l umn <nome col onna> <op z 1> opz 2 >
• Es.co l umn desc head i ng “ Desc r izio ne”
8
Formattazione
• FORMAT <formato>
• Formati– A<n> fissa la ampiezza della colonna a n
caratteri– 99,999.99 fissa la ampiezza ed i decimali di
un numero
Formattazione
• HEADING <text>
– fornisce il nome <text> per l’ intestazione dellacolonna
• NULL <text>
– fornisce il default <text> per la stampa deivalori NULL
9
Formattazione
• COLUMN <nome colonna> CLEAR
– annulla la formattazione vigente sullacolonna <nome colonna>
Report (0)
CREATE TABLE Prodotto(
Pid integer,
Descrizione CHAR(120),
Fornitore CHAR(20),
Costo integer,
PRIMARY KEY (PId));
10
Report (1)
TTitle 'Tabella dei Prodotti - Esempio di Report'
BTitle 'by R. Basili'
Column PId heading 'CODE' format 999990Column Descrizione Heading 'Descrizione' format
a20 word_wrappedColumn Fornitore Heading 'Prodotto '
format a10 truncColumn Costo Heading 'Costo al Forn '
format 999990.99Break on
Column Pr_Cons Heading 'Prezzo ' format 99999990.99
Report (2)
set pagesi ze 20
sp ool R eport 1. sqlse l ect PID, Descr i zion e,
Forni t ore , Cost o, ( Costo * 2. 5) as Pr_Consfr om Pr odott oor der b y Cost o, PI d;
11
Report (3)
Mer Nov 08 pagina 1
Tabella dei Prodotti - Esempio di Report
CODE Descrizione Prodotto Costo al Forn Prezzo
------- -------------------- ---------- -------------- ------------
3 Cravatta Uomo Missoni 30000.00 75000.00
1 Scarpe Mocassini Valleverde 50000.00 125000.00
Uomo
2 Scarpe Mocassini Valleverde 60000.00 150000.00
Donna
4 Giacca Uomo Armani 250000.00 625000.00
by R. Basili
PLSQL: Struttura di un blocco[Header]
[DECLARE
<Costanti>
<Variabili>
<Cursori>
<Gestori di eccezioni/errori> ]
BEGIN
<Istruzioni PL/SQL>
[ EXCEPTIONS
<Gestione eccezioni/errori> ]
END
/
12
PLSQ: Dichiarazioni
DECLARE
Rica vo n umber (38) ;
coun t er number (9) : = 0;
Prod I D Pro dott o. PId %TYPE;
De Pro dott o. Descrizi one%TYPE;
Forn Pro dott o. For nitor e%TYPE;
Cst Pro dott o. Cost o%TYPE;
Prd cna me%ROWTYPE;
cu r sor cname( Th r esh Prodo t to . Costo %TYPE ) i s
se l ect *
fr om P r odot t o
wh ere Costo >= T hresh ;
PLSQL: blocco…
BEGIN
commit;
open cname(2000);
counter := 0;
loop
fetch cname into Prd ;
exit when cname%NOTFOUND;
ProdId := Prd . PId ;
Cst := Prd . Costo ;
De := Prd . Descrizione ;
Ricavo := Cst * 1.25;
counter := counter + 1;
end loop;
close cname;
END;
/
13
BEGIN
…
lo op
f etch cnam e int o Prd ;
e xit when cname%NOTFOUND;
P r odI d:= Pr d. PId ; Cst : =Pr d. Cost o; D e:= Pr d. Descriz i one ;
Ri cav o := Cst * 1.25 ;
D BMS_OUTPUT.PUT_LINE ( ' Il Prod otto : '
|| De
| | ' ha un pre zzo d i ' | | to _char ( Rica vo) ) ;
c ount er := coun t er + 1;
end l oop;
close cna me;
DBMS_OUTPUT.PUT_LIN E(' S ono s t ati anal i zzat i '
| | to_ char ( coun t er) | | ' prod otti ' );
END;
/
PLSQL: Output
Gestione dell ’ Input
PROMPT Sele ziona il di par t imen t o
ACCEPT dpn NUMBER PROMPT
" Dip artim ento n.:"
SELECT nome, cog nome, dep t no
FROM i mpi egati
WHERE dept no = &dpn ;
14
Gestione dell ’ Input (2)
SQLprompt >
Sel ezio na i l dip artim ento
Di parti ment o n.: 3
Nome COGN OME DE PTNO
---- - --- ---- - --- ----- - ---
Mari o ROSSI 3
Massi mo BIAN CHI 3
...
Gestione dell ’ Input (3)
PROMPT Digita Cognome
ACCEPT cgnme PROMPT ”Cognome Imp i egato : "
SELECT Nome, Cognome, deptno
FROM impieg ati
WHERE UPPER(cognome) l i ke UPPER( '%&cgnme%');
15
Attivazione di un programma PL/SQL
• Dato un programma PL/SQL, memorizzato in unfile PLSQLprog.sql, la sua attivazione e' possibilemediante il seguente comando SQLplus:
SQLplusPrompt> start PLSQLprog
cursor cname( Thresh Prodotto.Costo%TYPE ) is
select *
from Prodotto
where Costo >= Thresh
ORDER BY Costo;
cursor Tutti_Prodotti is
select *
from Prodotto;
Prd1 cname%ROWTYPE;
Prd2 Tutti_Prodotti%ROWTYPE;
Cost_Diff number(10,2);
PLSQL: Cursori Annidati
16
for Prd in cname(30000)
loop
Cst := Prd .Costo;
if Cst *1.25 > 50000 then
De := Prd .Descrizione;
Ricavo := Cst * 1.25;
ProdId := Prd . PId ;
counter2 := 0;
for Prd2 in Tutti_ Prod
loop
Cost _Diff := abs (Prd2.Costo - Cst )/Prd2.Costo;
if Cost _Diff <= 0.20 then
counter2 := counter2 + 1;
end if ;
end loop; /* su Tutti_ Prod */
end if ;
counter := counter + 1;
end loop; /* su CNAME() */
PLSQL: Cursori Annidati(2)
FI LE in i t . or a
…
ut l _fil e = c:\Da t abas e\ dat i Ute nte
ut l _fil e_di r = c : \Dat abase \ dat i Scambio
FI LE Pr ovaF I LE. sql
Outd i r c har (2 00);
Outf i len ame c har (2 5);
Outf UTL _FILE . FILE _TYPE;
…
O utdir := ' C:\D ocumenti\D i dat t ica\ Basid i Dat i \Ese mpio' ;
O utfil ename := ' Mio. dat' ;
D BMS_OUTPUT.PUT_LINE ( 'Tr ying to o pen < ’ || Outd i r ||
'/ ’ || Outf i lena me );
O utf : = ut l _fil e. fop en( Out dir , Out f ilen ame, ' w');
File I/O - Preliminari
17
…
O utf : = ut l _fil e.fop en(Ou t dir , Out f ilen ame, ' w');
D BMS_OUTPUT.PUT_LINE ('Fi l e O pened !!' ) ;
loo p
f etch cnam e int o Prd ;
e xit when cname%NOTFOUND;
P r odI d := Prd.P I d;Cs t := Prd. Costo ; De : = Pr d.Des crizi one;
R i cav o := Cst * 1.25 ;
u t l_f i le.p utf( Outf,
' Il prodo t to % s ha un p r ezzo di %s\n' ,
trim ( De) , to _char ( Ric avo)) ;
u t l_f i le.n ew_li ne(Ou t f);
c ount er := coun t er + 1;
end loo p;
clo se c name;
utl _fil e.ffl ush(O utf); utl _file . fclo se(Outf);
PLSQL: File I/O
TriggersCREATE OR REPLACE TRI GGER chec k_eta
B EFORE INSERT OR UPDATE ON im piega t i
F OR EACH ROW
D ECLARE
eta NUMBER;
err or_msg CHAR(18 0);
B EGIN
eta := ( ( sy sdate - :n ew. nascit a) / 365) ;
IF ( eta < 16 ) THEN
erro r _msg := ' Atten zion e: '| | :new . fna me||' '||
: new. l name || ' ha s olo ' ||
T O_CHAR( et a, '9 9.9' ) || ' ann i .';
RAIS E_APPLICATI ON_ERROR ( -2 0601, err or_ms g);
END IF;
E ND;
/
18
Triggers (2)
• Compilazione OK
– trigger memorizzato nello schema utente
• Alcuni errori minori in BEGIN … END
– msg: “Trig ger c r eate d wit h co mpila t ion erro r s” .
• Errori importanti (CREATE OR REPLACE TRIGGER)
– trigger e’ respinto e non memorizzato
SQL> SELECT trigger_name, trigger_body
FROM user_triggers
WHERE trigger_name = 'CHECK_AGE';
Funzioni o Procedure
CREATE OR REPLACE PROCEDURE elimina _da_inventario (
locid _corr IN NUMBER,
prodid _corr IN VARCHAR,
quantita _da_eliminare IN NUMBER) AS
quantita _corr NUMBER;
error_msg CHAR(180);
BEGIN
quantita _corr := 0;
...
END;
/
19
Funzioni o Procedure (1)
BEGIN
quantita _corr := 0;
-- Cerca nella localizzazione
-- SE la quantita' corrente e' non sufficienteattiva EXCEPTION
-- Altrimenti aggiorna
SELECT quant
INTO quantita _corr
FROM inventario
WHERE inventario . locationid = locid _corr
AND inventario . productid = prodid _corr ;
Funzioni o Procedure (2)
-- materiale in inventario sufficiente
IF ( quantita _corr - quantita _da_eliminare > 0)THEN
UPDATE inventario
SET quant = quant - quantita _da_eliminare
WHERE inventario . locationid = locid _corr
AND inventario . productid = prodid _corr ;
END IF;
20
Funzioni o Procedure (3)
-- materiale in inventario appena sufficente
IF ( quantita _corr - quantita _da_eliminare = 0)THEN
DELETE FROM inventario
WHERE inventario . locationid = locid _corr
AND inventario . productid = prodid _corr ;
END IF;
Funzioni o Procedure (4)
-- poco materiale in inventario
IF ( quantita _corr - quantita _da_eliminare < 0) THEN
error_msg := 'ERRORE: Quantita insufficiente !!';
RAISE_APPLICATION_ERROR (-20602, error_msg);
END IF;
21
Funzioni o Procedure (5)
EXCEPTION
-- nessun materiale in inventario
WHEN NO_DATA_FOUND THEN
BEGIN
error_msg := 'ERROR: Prodotto ' ||
prodid _corr ||
' non presente !!';
RAISE_APPLICATION_ERROR (-20603, error_msg);
END; -- fine eccezioni
END; -- fine procedura elimina _da_inventario /3
/
Invocazione
• EXECUTE elimi na_da_inve ntario (10 6,'P500', 10)
CREATE OR REPLACE FUNCTION data_ nascita
( impid in number)
return date
as nascita
begin
… -- aggiorna nascita
return nascita ;
end;
• if ( data_ nas cita (234)> 01-GEN-98 ) then