21
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 di sviluppo 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

Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

Embed Size (px)

Citation preview

Page 1: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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

Page 2: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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.

Page 3: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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

Page 4: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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.

Page 5: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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

Page 6: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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

Page 7: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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”

Page 8: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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

Page 9: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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

Page 10: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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;

Page 11: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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

/

Page 12: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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;

/

Page 13: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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 ;

Page 14: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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%');

Page 15: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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

Page 16: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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

Page 17: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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;

/

Page 18: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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;

/

Page 19: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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;

Page 20: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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;

Page 21: Oracle - PL/SQL · 2 Oracle: Prodotti • SQL*TextRetrieval and Oracle Context - Una suite di strumenti e API per la ricerca bibliografica. • Programmer/2000 - include Pro

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