Académique Documents
Professionnel Documents
Culture Documents
Welcome to Oracle
Corso introduttivo al Database Oracle
Versione 2.0
Architettura
Installazione
SQL
PL/SQL
XML DB
Sommario
Sommario............................................................................................... 2
Nota sul diritto dautore della versione 1.0 di Welcome To Oracle ....... 8
Nota sul diritto dautore della versione 2.0 di Welcome To Oracle ..... 10
Introduzione ......................................................................................... 11
1
Architettura di Oracle .................................................................. 13
1.1
Istanza e database .............................................................. 13
1.2
Istanza - Processi di base.................................................... 14
1.2.1
PMON Process Monitor ............................................ 14
1.2.2
SMON System Monitor ............................................. 14
1.2.3
DBWn Database Writer ............................................ 14
1.2.4
LGWR Log Writer ..................................................... 14
1.2.5
CKPT Checkpoint ..................................................... 14
1.3
Istanza - Strutture di memoria ............................................. 14
1.3.1
SGA System Global Area ......................................... 15
1.3.2
PGA Program Global Area ....................................... 15
1.4
Database - Strutture per la memorizzazione dei dati .......... 16
1.4.1
Datafile e blocchi.......................................................... 16
1.4.2
Extent ........................................................................... 16
1.4.3
Tablespace .................................................................. 17
1.4.4
Segment....................................................................... 17
1.5
Database - File di controllo e di log ..................................... 17
1.5.1
Il control file .................................................................. 17
1.5.2
I Redo Log file .............................................................. 18
2
Installazione ................................................................................ 19
2.1
Prerequisiti per linstallazione del db ................................... 19
2.1.1
Requisiti Hardware ...................................................... 19
2.1.2
Requisiti Software ........................................................ 20
2.2
Scaricare il software ............................................................ 20
2.3
Installazione del database ................................................... 23
2.4
Installazione del client.......................................................... 34
3
Operazioni preliminari ................................................................. 38
3.1
Avviare ed arrestare Oracle ................................................. 38
3.1.1
Startup ......................................................................... 39
3.1.2
Shutdown ..................................................................... 39
3.2
Connettersi al database ....................................................... 41
3.2.1
Utenti e schemi ............................................................ 41
3.2.2
Connettersi dal server dove installato il db ............... 41
3.2.3
Connettersi da un client remoto ................................... 42
3.2.4
Creare un nuovo utente ............................................... 50
4
SQL*Plus e SQL Developer ........................................................ 51
4.1
SQL*Plus ............................................................................. 51
4.1.1
Perch ancora SQL*Plus ............................................. 52
4.1.2
Personalizzare SQL*Plus (Windows) .......................... 52
4.1.3
Parametri e comandi di SQL*Plus ............................... 55
4.1.4
Scrittura e modifica di unistruzione SQL..................... 57
4.1.5
esecuzione di uno script SQL ...................................... 61
4.1.6
Cambio del prompt SQL .............................................. 61
4.2
SQL Developer .................................................................... 62
4.2.1
Avvio di SQL Developer............................................... 62
4.2.2
Parametri e comandi di SQL Developer ...................... 64
5
Oggetti del DB ............................................................................. 65
5.1
Il dizionario dati .................................................................... 65
5.2
Tabelle ................................................................................. 68
5.2.1
Colonne di una tabella ................................................. 69
5.2.2
Constraint .................................................................... 70
5.3
Indici..................................................................................... 71
5.3.1
Indici B-Tree ................................................................ 72
5.3.2
Indici Bitmap ................................................................ 73
5.4
IOT ....................................................................................... 73
5.5
Cluster di tabelle .................................................................. 74
5.6
Viste ..................................................................................... 75
5.6.1
Check option constraint ............................................... 75
5.7
Viste materializzate.............................................................. 76
5.8
Sequenze ............................................................................. 76
5.9
Sinonimi ............................................................................... 77
5.10 Database link ....................................................................... 77
5.11 Oggetti PL/SQL.................................................................... 77
5.11.1 Procedure .................................................................... 78
5.11.2 Funzioni ....................................................................... 78
5.11.3 Package ....................................................................... 78
5.11.4 Trigger.......................................................................... 78
5.12 Estensioni Object-Oriented .................................................. 78
5.13 XML DB................................................................................ 79
6
CASE STUDY ............................................................................. 80
6.1
Progettazione....................................................................... 80
6.2
Il database desempio .......................................................... 81
6.2.1
Tabelle ......................................................................... 81
6.2.2
Dati............................................................................... 83
6.3
SCOTT/TIGER ..................................................................... 84
SQL ............................................................................................. 87
7.1
Tipi di dato ........................................................................... 88
7.1.1
Dati alfanumerici .......................................................... 89
7.1.2
Numeri ......................................................................... 91
7.1.3
Date ed orari ................................................................ 91
7.1.4
Dati binari ..................................................................... 92
7.2
Comandi DDL ...................................................................... 92
7.2.1
CREATE ...................................................................... 92
7.2.2
ALTER ....................................................................... 112
7.2.3
RENAME.................................................................... 122
7.2.4
DROP......................................................................... 123
7.2.5
TRUNCATE ............................................................... 125
7.2.6
PURGE ...................................................................... 126
7.2.7
FLASHBACK TABLE ................................................. 128
7.3
Comandi DML .................................................................... 129
7.3.1
Valori fissi................................................................... 129
7.3.2
INSERT ...................................................................... 130
7.3.3
UPDATE .................................................................... 139
7.3.4
DELETE ..................................................................... 141
7.3.5
MERGE ...................................................................... 142
7.3.6
Gestione degli errori in SQL con LOG ERRORS ...... 147
7.4
SELECT, il comando di ricerca .......................................... 153
7.4.1
Proiezioni ................................................................... 154
7.4.2
La tabella DUAL ......................................................... 156
7.4.3
Pseudo colonne ......................................................... 158
7.4.4
Selezioni .................................................................... 160
7.4.5
Ordinamento .............................................................. 179
7.4.6
Raggruppamenti ........................................................ 183
7.4.7
Tornando su ROWNUM ............................................. 194
7.4.8
Le clausole PIVOT ed UNPIVOT ............................... 196
7.4.9
Query gerarchiche ..................................................... 201
7.4.10 La clausola MODEL ................................................... 210
7.5
Manipolazione dei dati ....................................................... 221
7.5.1
Operatore di concatenazione..................................... 221
7.5.2
Operatori aritmetici .................................................... 223
7.5.3
Funzioni sulle stringhe ............................................... 224
7.5.4
Funzioni sui numeri .................................................... 235
7.5.5
Funzioni sulle date ..................................................... 240
7.5.6
Funzioni di conversione ............................................. 248
7.5.7
Formati per la rappresentazione delle date ............... 251
7.5.8
Formati per la rappresentazione dei numeri .............. 255
7.5.9
Gestione dei valori nulli .............................................. 256
7.5.10 Espressioni regolari ................................................... 261
7.5.11 DECODE e CASE ...................................................... 266
7.5.12 GREATEST e LEAST ................................................ 270
7.6
JOIN: ricerche da pi tabelle ............................................. 272
7.6.1
Sintassi per la JOIN ................................................... 272
7.6.2
Prodotto cartesiano di tabelle .................................... 272
7.6.3
Inner join .................................................................... 274
7.6.4
Outer join ................................................................... 277
7.7
Gli operatori insiemistici ..................................................... 283
7.7.1
UNION ....................................................................... 283
7.7.2
UNION ALL ................................................................ 286
7.7.3
INTERSECT .............................................................. 287
7.7.4
MINUS ....................................................................... 288
7.8
Ricerche innestate ............................................................. 289
7.8.1
Operatori di confronto ................................................ 290
7.8.2
Subquery correlate e scorrelate ................................ 294
7.8.3
La clausola WITH ...................................................... 297
7.9
Comandi TCL ..................................................................... 298
7.9.1
Gestione delle transazioni ......................................... 298
7.9.2
COMMIT .................................................................... 298
7.9.3
ROLLBACK ................................................................ 300
7.9.4
SAVEPOINT .............................................................. 301
7.9.5
SET TRANSACTION ................................................. 303
7.9.6
Lock di dati ed oggetti ................................................ 307
7.9.7
Una situazione particolare, il deadlock ...................... 308
7.10 Comandi DCL .................................................................... 310
7.10.1 GRANT ...................................................................... 310
7.10.2 REVOKE .................................................................... 311
7.10.3 RUOLI ........................................................................ 311
8
PL/SQL...................................................................................... 313
8.1
Blocchi PL/SQL anonimi .................................................... 314
8.2
Struttura di un blocco PL/SQL anonimo ............................ 314
8.3
Dichiarazione di costanti e variabili ................................... 317
8.3.1
Tipi di dato ................................................................. 317
8.3.2
Dichiarazione di variabili ............................................ 317
8.3.3
Dichiarazione di costanti ............................................ 318
8.4
Costrutti di base ................................................................. 319
8.4.1
Assegnazione di un valore......................................... 319
8.4.2
Strutture Condizionali ................................................ 319
8.4.3
Strutture Iterative ....................................................... 322
8.4.4
Strutture Sequenziali ................................................. 326
8.5
Utilizzo dellSQL................................................................. 328
8.5.1
SQL Statico ................................................................ 328
8.5.2
SQL Dinamico ............................................................ 329
8.5.3
CURSORI .................................................................. 333
8.6
Gestione delle eccezioni .................................................... 338
8.6.1
Blocco Exception ....................................................... 338
8.6.2
Eccezioni predefinite.................................................. 339
8.6.3
SQLCODE e SQLERRM ........................................... 343
8.6.4
Sollevare uneccezione .............................................. 344
8.6.5
Eccezioni utente......................................................... 345
8.6.6
Eccezioni mute........................................................... 346
8.6.7
Eccezioni in un ciclo .................................................. 347
8.6.8
Propagazione delle eccezioni .................................... 349
8.7
Tipi di dato complessi ........................................................ 351
8.7.1
Record ....................................................................... 351
8.7.2
Array associativi (PL/SQL Tables) ............................. 354
8.7.3
Varray ........................................................................ 358
8.7.4
Nested Table.............................................................. 359
8.7.5
Bulk collect ................................................................. 360
8.7.6
Metodi delle collezioni ................................................ 361
8.8
Oggetti PL/SQL nel DB ...................................................... 372
8.8.1
Procedure .................................................................. 372
8.8.2
Funzioni ..................................................................... 380
8.8.3
Package ..................................................................... 386
8.8.4
Database Trigger ....................................................... 396
8.8.5
Dipendenze tra oggetti del DB ................................... 411
8.8.6
Diritti desecuzione ..................................................... 415
8.8.7
Controllo del codice PL/SQL...................................... 418
8.9
Argomenti avanzati di PL/SQL........................................... 422
8.9.1
Gestione dei BLOB .................................................... 422
8.9.2
Crittografia in PL/SQL ................................................ 425
8.9.3
Inviare email dal DB ................................................... 434
8.9.4
Il package DBMS_METADATA. ................................ 437
8.9.5
Oracle Scheduler. ...................................................... 442
8.9.6
Compilazione condizionale ........................................ 446
8.9.7
Le direttive di compilazione PRAGMA ....................... 451
8.9.8
PL/SQL Trace ............................................................ 459
8.9.9
PL/SQL Profiling ........................................................ 465
9
XML DB ..................................................................................... 472
9.1
Il tipo XMLType .................................................................. 472
9.2
Query SQL in formato XML ............................................... 473
9.3
Aggiornamento di documenti XML..................................... 497
9.4
Alcune nuove funzioni........................................................ 503
9.5
Supporto di XML Schema. ................................................. 508
9.6
Creare documenti Office con XML e PL/SQL. ................... 518
10 Prerequisiti ................................................................................ 539
10.1 Database e database relazionali ....................................... 539
10.1.1 database .................................................................... 539
10.1.2 database relazionali ................................................... 540
10.1.3 DBA ............................................................................ 541
10.2 Progettazione di un db relazionale .................................... 542
10.2.1 Modello entit/relazioni .............................................. 542
10.2.2 Normalizzazione ........................................................ 542
10.2.3 Definizione dello schema fisico.................................. 546
Massimo Ruocchio
Massimo Ruocchio
10
Introduzione
Welcome To Oracle nasce da una lunga esperienza di docenza
in corsi su Oracle. Ho conosciuto la tecnologia Oracle nel 1996 ed ho
cominciato ad insegnarla nel 1998, continuo tuttora sia ad utilizzarla
per scopi professionali sia a tenere corsi.
Ho sempre incontrato una certa difficolt a reperire il materiale
didattico da fornire ai miei studenti. Un principiante ha bisogno di un
manuale che parta proprio dalle basi, senza dare nulla per scontato,
ma che allo stesso tempo si spinga abbastanza avanti da soddisfare le
menti pi curiose e veloci nellapprendimento.
Dopo avere rinunciato a trovare un manuale adatto alle mie
esigenze ho deciso di scriverlo, pensando che fosse in effetti
unimpresa semplice, visto che si trattava di mettere su carta ci che
ripeto ai miei studenti da anni! Mi sbagliavo alla grande, la prima
stesura di questo manuale ha richiesto, tra notti di lavoro e lunghe
pause di riflessione, dieci mesi: da agosto 2010 a giugno 2011.
Ho cercato di produrre un manuale che si possa leggere a pi
livelli. Un principiante deve essere, leggendo questo libro, in grado di
scaricare il database, installarlo ed apprendere i primi rudimenti di SQL
e PL/SQL. Un lettore di media esperienza deve finalmente
comprendere larchitettura di Oracle, afferrandone pienamente i
principi, ed approfondire gli aspetti di SQL e PL/SQL che non ha mai
avuto il tempo di guardare. Un lettore esperto deve poter, con questo
manuale, rimettere ordine nelle sue conoscenze e trovare spunti per
nuove indagini approfondite su temi avanzati. In fondo c sempre
qualcosa da imparare, qualunque sia il proprio livello di conoscenza ed
esperienza.
Se questo manuale centri o meno gli obiettivi ambiziosi che si
prefigge non sono in grado di dirlo. Spero me lo dicano i lettori.
Nel manuale sono stati utilizzati molti termini inglesi di uso
consueto nellambiente tecnico italiano. Una traduzione del termine
tablespace, ad esempio, sarebbe stata una forzatura non giustificata.
Si sono invece tradotti in italiano i termini comuni come tabella, vista o
sequenza.
Il manuale si propone di essere il pi possibile autoconsistente,
fornendo al lettore i rudimenti di base che consentono di comprendere
pienamente lesposizione. Il capitolo 10 dedicato a tali prerequisiti.
11
Giugno 2011
12
Massimo Ruocchio
1 Architettura di Oracle
1.1
Istanza e database
Nel linguaggio comune si utilizza genericamente il termine
13
1.2
Unistanza
obbligatori:
1.2.1
Oracle
include
almeno
seguenti
processi
CKPT Checkpoint
1.3
14
1.3.1
15
1.4
1.4.1
Datafile e blocchi
uno spazio libero da utilizzare nel caso in cui i dati contenuti nel
blocco vengano modificati in momenti successivi allinserimento,
I blocchi non vengono riempiti mai per intero. Ogni volta che un
utente inserisce una riga in una tabella, Oracle aggiunge una nuova
riga nel blocco corrente facendo sempre attenzione a lasciare libero lo
spazio riservato per gli aggiornamenti dei dati. Se Oracle determina
che linserimento della nuova riga nel blocco farebbe diminuire
eccessivamente lo spazio libero, passa al blocco successivo ed
inserisce l la nuova riga. La dimensione dello spazio libero minimo per
ogni blocco pu essere definita in fase di creazione del database o
delle singole tabelle.
1.4.2
Extent
16
Tablespace
Segment
1.5
Il control file
17
18
2 Installazione
2.1
Requisiti Hardware
19
2.1.2
Requisiti Software
2.2
Scaricare il software
20
21
Passo 4 Avviare il download dei singoli file, per ogni file sar
richiesto di accettare laccordo di licenza.
22
2.3
23
24
Passo 6 Selezionare
25
26
27
28
29
30
31
32
33
2.4
34
35
36
37
3 Operazioni preliminari
3.1
38
Startup
Shutdown
39
40
3.2
Connettersi al database
Utenti e schemi
41
3.2.3
42
43
44
45
46
47
48
49
50
4.1
SQL*Plus
51
52
53
54
55
Ad esempio
Show linesize
56
57
58
59
60
oppure
@c:\test.sql
61
4.2
SQL Developer
62
63
64
5 Oggetti del DB
5.1
Il dizionario dati
65
Tipo
------------VARCHAR2(30)
VARCHAR2(4000)
Tipo
------------VARCHAR2(30)
VARCHAR2(4000)
Tipo
------------VARCHAR2(30)
VARCHAR2(11)
Tipo
------------VARCHAR2(30)
VARCHAR2(11)
66
67
5.2
Tabelle
68
Tipo
---------------NUMBER
VARCHAR2(20)
DATE
69
5.2.2
Constraint
10.1.2:
paragrafo
10.1.2.
70
5.3
Indici
71
righe, scartare tutti i clienti che non si chiamano Rossi e prendere gli
altri. Sarebbe tutto molto pi semplice se i record fossero ordinari per
cognome, in quel caso infatti mediante una ricerca dicotomica (
10.6) sarebbe possibile trovare i Rossi in, al pi, 21 letture. Oracle
per non pu certo archiviare i dati sul disco in uno specifico ordine,
quindi necessario utilizzare delle strutture dati aggiuntive che
consentano di velocizzare laccesso.
5.3.1
Indici B-Tree
Da A- a F
Da G- a M
Da N- a S
Da T- a Z
Abate rowid
Amici rowid
Atzeni rowid
Cognomi
con la B
72
Ultimo
gruppo di
cognomi
Indici Bitmap
5.4
IOT
73
5.5
Cluster di tabelle
74
5.6
Viste
75
dalla vista MASCHI. quindi possibile inserire in una vista una riga di
dati che poi non potr mai essere letta attraverso quella stessa vista.
Per evitare che si verifichi questa situazione possibile, in fase
di creazione della vista, attivare il constraint check option.
Quando questo constraint attivo Oracle impedisce di inserire
un record in una vista se questo non pu essere poi letto usando la
stessa vista. Nel nostro esempio tentando di inserire una riga in
FEMMINE con SESSO=M si otterrebbe un errore.
5.7
Viste materializzate
5.8
Sequenze
76
5.9
Sinonimi
sinonimo
di
SYS.USER_CATALOG.
Non
assegnati
utilizzabile
utilizzabile
pubblici.
77
78
5.13 XML DB
Con la seconda release della versione 9 del DB Oracle ha
introdotto un insieme di nuove funzionalit che consentono di
conservare nel db, e manipolare molto pi semplicemente del passato,
contenuti in formato XML. Tali funzionalit sono accorpate sotto il
nome di Oracle XML DB. Queste caratteristiche sono state nelle
versioni successive ulteriormente implementate raggiungendo un
buono stato di maturit e completezza. In questo corso stato
riservato allargomento il capitolo 9. In quel capitolo non ci si propone
di trattare il tema in modo organico, tale trattazione richiederebbe
infatti troppo spazio ed sicuramente al di l degli obiettivi di questo
corso. Lobiettivo del capitolo 9, invece, di fornire alcuni spunti di
riflessione relativi ad alcune specifiche tematiche che accendano
linteresse del lettore sullargomento.
79
6 CASE STUDY
6.1
Progettazione
10.2).
80
6.2
Il database desempio
Tabelle
Tipo
Obbl.
PK
COD_CLIENTE
NUMBER(8)
SI
SI
NOME
VARCHAR2(30)
SI
COGNOME
VARCHAR2(30)
SI
COD_FISC
CHAR(16)
INDIRIZZO
VARCHAR2(30)
SI
CAP
CHAR(5)
SI
COMUNE
CHAR(4)
SI
UK
FK
Note
I valori di questa
colonna
sono
generati
mediante
la
sequenza
SEQ_CLIENTI
SI
SI
Referenzia
la
tabella COMUNI
81
COMUNI
Nome Colonna
Tipo
Obbl.
PK
COD_COMUNE
CHAR(4)
SI
SI
DES_COMUNE
VARCHAR2(50)
SI
PROVINCIA
CHAR(2)
SI
UK
FK
Note
PRODOTTI
Nome Colonna
Tipo
Obbl.
PK
COD_PRODOTTO
VARCHAR2(12)
SI
SI
DESCRIZIONE
VARCHAR2(50)
SI
PREZZO_LISTINO
NUMBER(7,2)
SI
UK
FK
Note
ORDINI
Nome Colonna
Tipo
Obbl.
PK
NUM_ORDINE
NUMBER(8)
SI
SI
DATA_ORDINE
DATE
SI
COD_CLIENTE
NUMBER(8)
SI
IMPORTO
NUMBER(10,2)
SI
NOTE
VARCHAR2(100)
UK
FK
Note
I valori di questa
colonna
sono
generati mediante
la
sequenza
SEQ_ORDINI
SI
Referenzia
la
tabella CLIENTI
FK
Note
PRODOTTI_ORDINATI
Nome Colonna
Tipo
Obbl.
PK
NUM_ORDINE
NUMBER(8)
SI
SI
SI
Referenzia
la
tabella ORDINI
COD_PRODOTTO
VARCHAR2(12)
SI
SI
SI
Referenzia
tabella
PRODOTTI
QUANTITA
NUMBER
SI
PREZZO_UNITARIO
NUMBER(7,2)
SI
82
UK
la
FATTURE
Nome Colonna
Tipo
Obbl.
PK
NUM_FATTURA
NUMBER(8)
SI
SI
NUM_ORDINE
NUMBER(8)
SI
DATA_FATTURA
DATE
SI
IMPORTO
NUMBER(7,2)
SI
PAGATA
CHAR(1)
SI
6.2.2
UK
FK
Note
I
valori
di
questa
colonna sono generati
mediante la sequenza
SEQ_FATTURE
SI
Referenzia
ORDINI
la
tabella
Valori ammessi S, N
Dati
NOME
-------MARCO
GIOVANNI
MATTEO
LUCA
AMBROGIO
GENNARO
PASQUALE
VINCENZO
COGNOME
-------ROSSI
BIANCHI
VERDI
NERI
COLOMBO
ESPOSITO
RUSSO
AMATO
COD_FISC
INDIRIZZO
---------------- ---------------------RSSMRC70R20H501X VIA LAURENTINA, 700
VIA OSTIENSE, 850
VRDMTT69S02H501X VIA DEL MARE, 8
NRILCU77A22F205X VIA TORINO, 30
PIAZZA DUOMO, 1
SPSGNN71B10F839X VIA CARACCIOLO, 100
RSSPSQ70C14F839X VIA GIULIO CESARE, 119
VIA NAPOLI, 234
CAP
----00143
00144
00033
20120
20100
80100
80125
80022
COMU
---H501
H501
G811
F205
F205
F839
F839
G964
DES_COMUNE
-------------------------------------------------ROMA
POMEZIA
FIUMICINO
MILANO
PIOLTELLO
LAINATE
NAPOLI
POZZUOLI
PORTICI
PR
-RM
RM
RM
MI
MI
MI
NA
NA
NA
DESCRIZIONE
PREZZO_LISTINO
------------------------------------- -------------Televisore LCD 22 pollici
300
Televisore LCD 32 pollici
500
Televisore LCD 40 pollici
700
PC Notebook tipo 1
500
PC Notebook tipo 2
800
PC Notebook tipo 3
1200
E-book reader
200
Router N300
100
83
COD_PRODOTTO
QAUNTITA PREZZO_UNITARIO
------------ ---------- --------------TVLCD32
1
500
EBOOK
2
180
TVLCD40
1
700
ROUTER
10
100
NOTEBOOK3
1
1200
TVLCD40
1
700
NOTEBOOK3
1
1000
6.3
SCOTT/TIGER
84
TABLE_TYPE
----------TABLE
TABLE
TABLE
TABLE
ENAME
-------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
JOB
MGR HIREDATE
SAL
COMM DEPTNO
--------- ----- --------- -------- -------- -----CLERK
7902 17-DEC-80
800
20
SALESMAN
7698 20-FEB-81
1600
300
30
SALESMAN
7698 22-FEB-81
1250
500
30
MANAGER
7839 02-APR-81
2975
20
SALESMAN
7698 28-SEP-81
1250
1400
30
MANAGER
7839 01-MAY-81
2850
30
MANAGER
7839 09-JUN-81
2450
10
ANALYST
7566 19-APR-87
3000
20
PRESIDENT
17-NOV-81
5000
10
SALESMAN
7698 08-SEP-81
1500
0
30
CLERK
7788 23-MAY-87
1100
20
CLERK
7698 03-DEC-81
950
30
ANALYST
7566 03-DEC-81
3000
20
CLERK
7782 23-JAN-82
1300
10
14 rows selected.
WTO> select * from dept;
DEPTNO
---------10
20
30
40
DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
85
86
7 SQL
87
7.1
Tipi di dato
Dal punto di vista strutturale i dati non sono tutti uguali. Una
data di nascita ha, ovviamente, una serie di caratteristiche ben diverse
dallimporto di una fattura. Ovviamente in teoria tutti i dati potrebbero
essere trattati come stringhe di caratteri alfanumerici, ma ci
impedirebbe al database di effettuare controlli formali allinserimento
dei dati e quindi sarebbe possibile inserire, ad esempio, pippo nella
data di nascita di un soggetto.
Per consentire il controllo formale di tutti i dati Oracle mette a
disposizione una serie di tipi di dato tra cui lutente del database pu
scegliere per ogni singola informazione da gestire. Scegliere per ogni
informazione il tipo di dato pi corretto consente un elevato livello di
controllo.
88
date ed orari;
Dati alfanumerici
89
90
7.1.2
Numeri
Tipo
Minimo numero
positivo
rappresentabile
Massimo numero
positivo
rappresentabile
NUMBER
10-130
<10126
NUMBER(38)
<1038
NUMBER(5,2)
0,01
999,99
NUMBER(5,-2)
100
9999900
NUMBER(3,8)
0,00000001
0,00000999
7.1.3
Date ed orari
91
Dati binari
7.2
Comandi DDL
CREATE
92
93
(
null>,
null>,
null>
94
Tipo
-----------NUMBER
NUMBER
NUMBER
NUMBER
95
Tipo
-----------NUMBER
VARCHAR2(30)
DATE
96
Creazione di un indice
La forma pi semplice dellistruzione di creazione di un indice
la seguente:
create index <nome schema>.<nome indice> ON <nome tabella>(
<nome colonna>,
<nome colonna>,
...
<nome colonna>
);
97
98
Nellesempio
seguente
viene
definito
il
cluster
COMUNI_PROVINCE avente come chiave di clusterizzazione il codice
della provincia e come spazio riservato ad ogni valore della chiave
(clausola SIZE) due blocchi di database (16384 byte nel caso
specifico):
WTO >create cluster COMUNI_PROVINCE (
2 cod_provincia char(2)
3 ) SIZE 16384;
Creato cluster.
99
Nullo?
-------NOT NULL
NOT NULL
NOT NULL
Tipo
---------------NUMBER(8)
VARCHAR2(30)
VARCHAR2(30)
CHAR(16)
NOT NULL VARCHAR2(30)
NOT NULL CHAR(5)
NOT NULL CHAR(4)
100
Nullo?
-------NOT NULL
NOT NULL
Tipo
---------------VARCHAR2(30)
VARCHAR2(30)
COGNOME
---------ROSSI
BIANCHI
COGNOME
---------ROSSI
BIANCHI
Tipo
-----------VARCHAR2(30)
VARCHAR2(30)
101
COGNOME
---------ROSSI
BIANCHI
102
COGNOME
---------ROSSI
BIANCHI
COGNOME
---------ROSSI
BIANCHI
COGNOME
---------ROSSI
BIANCHI
103
COGNOME
---------ROSSI
BIANCHI
104
COGNOME
---------ROSSI
BIANCHI
COGNOME
---------ROSSI
BIANCHI
COGNOME
---------ROSSI
BIANCHI
COGNOME
---------ROSSI
BIANCHI
105
106
107
108
NEXTVAL
---------4
109
Creazione di un sinonimo
Un sinonimo solo un nome alternativo che scegliamo di
utilizzare per un oggetto del db. La sintassi banale
CREATE SYNONYM <nome schema>.<nome sinonimo>
FOR <nome schema>.<nome oggetto>;
Nullo?
-------NOT NULL
NOT NULL
NOT NULL
Tipo
--------------NUMBER(8)
VARCHAR2(30)
VARCHAR2(30)
CHAR(16)
NOT NULL VARCHAR2(30)
NOT NULL CHAR(5)
NOT NULL CHAR(4)
110
Nullo?
-------NOT NULL
NOT NULL
NOT NULL
Tipo
-----------NUMBER(8)
VARCHAR2(30)
VARCHAR2(30)
CHAR(16)
NOT NULL VARCHAR2(30)
CAP
COMUNE
WTO >desc c2
Nome
----------------COD_CLIENTE
NOME
COGNOME
COD_FISC
INDIRIZZO
CAP
COMUNE
Nullo?
-------NOT NULL
NOT NULL
NOT NULL
Tipo
-----------NUMBER(8)
VARCHAR2(30)
VARCHAR2(30)
CHAR(16)
NOT NULL VARCHAR2(30)
NOT NULL CHAR(5)
NOT NULL CHAR(4)
111
DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
LOC
------------NEW YORK
DALLAS
CHICAGO
BOSTON
ALTER
tabella> ADD (
<null/not null>,
<null/not null>,
<null/not null>
112
Tipo
-----------NUMBER
VARCHAR2(30)
DATE
Tipo
-----------NUMBER
VARCHAR2(30)
DATE
NUMBER
DATE
tabella> MODIFY (
<null/not null>,
<null/not null>,
<null/not null>
Nullo?
Tipo
-------- -----------NOT NULL NUMBER
VARCHAR2(30)
NOT NULL NUMBER
DATE
DATE
113
Ad esempio:
WTO >desc test
Nome
----------------A
B
C
D
E
Nullo?
Tipo
-------- -----------NOT NULL NUMBER
VARCHAR2(10)
NOT NULL NUMBER
NUMBER
DATE
114
Nullo?
Tipo
-------- -----------NOT NULL NUMBER
VARCHAR2(10)
NOT NULL NUMBER
NUMBER
DATE
Ad esempio:
WTO >alter table test drop column d;
Tabella modificata.
WTO >desc test
Nome
----------------NUOVA_A
B
C
E
Nullo?
Tipo
-------- -----------NOT NULL NUMBER
VARCHAR2(10)
NOT NULL NUMBER
DATE
Nullo?
Tipo
-------- -----------NOT NULL NUMBER
VARCHAR2(10)
NOT NULL NUMBER
DATE
Nullo?
Tipo
-------- -----------NOT NULL NUMBER
VARCHAR2(10)
NOT NULL NUMBER
NUMBER
DATE
115
Nullo?
Tipo
-------- -----------NOT NULL NUMBER
VARCHAR2(10)
NOT NULL NUMBER
NUMBER
NUMBER
DATE
116
FOREIGN KEY
UNIQUE
CHECK
Specifica constraint
(
<nome colonna>,
<nome colonna>,
...
<nome colonna>
)
(
<nome colonna>,
<nome colonna>,
...
<nome colonna>
) REFERENCES <nome tabella> (
<nome colonna>,
<nome colonna>,
...
<nome colonna>
)
(
<nome colonna>,
<nome colonna>,
...
<nome colonna>
)
(<regola>)
117
118
Ad esempio
WTO >alter table TEST_DUP rename constraint X_PK to NUOVO_X_PK;
Tabella modificata.
119
Ad esempio
WTO >alter table TEST_DUP drop constraint NUOVO_X_PK;
Tabella modificata.
Modificare un indice
Nessuno dei parametri degli indici analizzati in precedenza pu
essere modificato con lALTER INDEX. Il comando seguente pu
essere utilizzato per rinominare lindice.
WTO >create index test_idx on test (c,x);
Indice creato.
WTO >alter index test_idx rename to test_idx_nuovo;
Modificato indice.
120
Modificare un sinonimo
Non esiste il comando ALTER SYNONYM, si utilizza la clausola
OR REPLACE dopo la CREATE.
Modificare una sequenza
Il comando ALTER SEQUENCE (senza parole chiave
aggiuntive) consente di modificare tutti i parametri gi descritti in fase
di creazione delle sequenze ad eccezione del valore di partenza, che
era stato definito mediante la clausola START WITH. Ad esempio
nellistruzione che segue si modifica la sequenza SEQ_TEST,
originariamente impostata per fornire un progressivo numerico
crescente senza buchi, per ottenere un progressivo di numeri che si
incrementi di tre unit ad ogni chiamata.
WTO >select seq_test.nextval from dual;
NEXTVAL
---------5
121
7.2.3
RENAME
122
DROP
123
124
7.2.5
TRUNCATE
Ad esempio:
WTO >truncate table test;
Tabella troncata.
125
Creato cluster.
--...E NON POSSO TRONCARLO
WTO >truncate cluster COMUNI_PROVINCE;
truncate cluster COMUNI_PROVINCE
*
ERRORE alla riga 1:
ORA-03293: Cluster to be truncated is a HASH CLUSTER
7.2.6
PURGE
126
TABLE_TYPE
----------TABLE
TABLE
SEQUENCE
SEQUENCE
SEQUENCE
TABLE
SEQUENCE
TABLE
TABLE
SEQUENCE
TABLE
TABLE
SEQUENCE
TABLE
TABLE
TABLE
TABLE
NEW_CLIENTI_ROMA
SEQ_TEST_NEW
BIN$HzDBX3YoS3m9RX5c+xg2/w==$0
BIN$H30bMxKuQput74HcB1GXcA==$0
BIN$d8Hp3XYlS1G0xuBp0rYIhA==$0
BIN$Sw7y9bgbQLSkwfEM+SLAnA==$0
VIEW
SEQUENCE
TABLE
TABLE
TABLE
TABLE
Selezionate 23 righe.
ORIGINAL_NAME
TYPE
-------------------------------SYS_C0047891
INDEX
TEST2
TABLE
TEST_IDX_NUOVO
INDEX
TEST_PK
INDEX
TEST_UK
INDEX
NEW_TEST
TABLE
TEST2
TABLE
SYS_C0047978
INDEX
127
7.2.7
FLASHBACK TABLE
128
7.3
Comandi DML
Valori fissi
129
INSERT
130
B
C
--------- -----------------------------13-GEN-11 Stringa d'esempio
13-GEN-11
B
C
--------- -----------------------------13-GEN-11 Stringa d'esempio
13-GEN-11
Test
B
C
--------- -----------------------------13-GEN-11 Stringa d'esempio
13-GEN-11
Test
Test con campi nulli
131
B
-----------------------------Test
Valore di default
132
B
-----------------------------Test
Valore di default
B
-----------------------------Test
Valore di default
Valore di default
133
134
H
I
--------- -----------------------------13-GEN-11 Stringa d'esempio
13-GEN-11
Test
Test con campi nulli
135
B
C
--------- -----------------------------13-GEN-11 Stringa d'esempio
13-GEN-11
Test
Test con campi nulli
H
I
--------- -----------------------------14-GEN-11 Stringa d'esempio
14-GEN-11
Test
Test con campi nulli
125,4 15-GEN-11 Stringa d'esempio
125,4 15-GEN-11
2
Test
Test con campi nulli
Selezionate 8 righe.
136
DATA_NASC
--------01-NOV-71
09-MAR-00
23-AGO-90
18-APR-95
S
M
F
M
F
DATA_NASC
--------01-NOV-71
23-AGO-90
S
M
M
137
DATA_NASC
--------01-NOV-71
23-AGO-90
S
M
M
DATA_NASC
--------01-NOV-71
09-MAR-00
23-AGO-90
18-APR-95
26-FEB-80
S
M
F
M
F
F
DATA_NASC
--------01-NOV-71
09-MAR-00
23-AGO-90
18-APR-95
26-FEB-80
10-MAG-87
Selezionate 6 righe.
138
S
M
F
M
F
F
F
7.3.3
UPDATE
DATA_NASC
--------01-NOV-71
09-MAR-00
23-AGO-90
18-APR-95
26-FEB-80
10-MAG-87
S
M
F
M
F
F
F
Selezionate 6 righe.
WTO >update persone
2 set data_nascita = date'2000-01-12';
Aggiornate 6 righe.
WTO >select * from persone;
NOME
---------Massimo
Laura
Marco
Clara
Veronica
Vittoria
DATA_NASC
--------12-GEN-00
12-GEN-00
12-GEN-00
12-GEN-00
12-GEN-00
12-GEN-00
S
M
F
M
F
F
F
Selezionate 6 righe.
139
DATA_NASC
--------12-GEN-00
12-GEN-00
12-GEN-00
12-GEN-00
12-GEN-00
10-MAG-87
S
M
F
M
F
F
F
Selezionate 6 righe.
DATA_NASC
--------13-GEN-00
13-GEN-00
13-GEN-00
13-GEN-00
13-GEN-00
11-MAG-87
S
M
F
M
F
F
F
Selezionate 6 righe.
140
7.3.4
DELETE
DATA_NASC
--------13-GEN-00
13-GEN-00
13-GEN-00
13-GEN-00
13-GEN-00
11-MAG-87
S
M
F
M
F
F
F
Selezionate 6 righe.
WTO >delete persone
2 where sesso='M';
Eliminate 2 righe.
WTO >select * from persone;
NOME
---------Laura
Clara
Veronica
Vittoria
DATA_NASC
--------13-GEN-00
13-GEN-00
13-GEN-00
11-MAG-87
S
F
F
F
F
141
7.3.5
MERGE
ENAME
------SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
JOB
--------CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
MGR
---7902
7698
7698
7839
7698
7839
7839
7566
7698
7788
7698
7566
7782
HIREDATE
SAL
COMM DEPTNO
--------- ----- ------ ------17-DIC-80
800
20
20-FEB-81 1600
300
30
22-FEB-81 1250
500
30
02-APR-81 2975
20
28-SET-81 1250
1400
30
01-MAG-81 2850
30
09-GIU-81 2450
10
09-DIC-82 3000
20
17-NOV-81 5000
10
08-SET-81 1500
0
30
12-GEN-83 1100
20
03-DIC-81
950
30
03-DIC-81 3000
20
23-GEN-82 1300
10
Selezionate 14 righe.
WTO> select * from myemp;
EMPNO
----7566
7654
7698
142
ENAME
------JONES
MARTIN
BLAKE
JOB
--------MANAGER
SALESMAN
MANAGER
MGR
---7839
7698
7839
HIREDATE
SAL
COMM DEPTNO
--------- ----- ------ ------02-APR-81 1000
20
28-SET-81 1000
1400
30
01-MAG-81 1000
30
7782
7788
7839
7844
7876
7900
7902
7934
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
7839 09-GIU-81
7566 09-DIC-82
17-NOV-81
7698 08-SET-81
7788 12-GEN-83
7698 03-DIC-81
7566 03-DIC-81
7782 23-GEN-82
1000
3000
5000
1500
1100
950
3000
1300
10
20
10
30
20
30
20
10
Selezionate 11 righe.
14 di righe unite.
WTO> select * from myemp;
EMPNO
----7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
7369
7499
7521
ENAME
-------JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
SMITH
ALLEN
WARD
JOB
MGR HIREDATE
SAL
COMM DEPTNO
--------- ----- --------- ------ ------ ------MANAGER
7839 02-APR-81
2975
20
SALESMAN
7698 28-SET-81
1250
1400
30
MANAGER
7839 01-MAG-81
2850
30
MANAGER
7839 09-GIU-81
2450
10
ANALYST
7566 09-DIC-82
3000
20
PRESIDENT
17-NOV-81
5000
10
SALESMAN
7698 08-SET-81
1500
0
30
CLERK
7788 12-GEN-83
1100
20
CLERK
7698 03-DIC-81
950
30
ANALYST
7566 03-DIC-81
3000
20
CLERK
7782 23-GEN-82
1300
10
CLERK
7902 17-DIC-80
800
20
SALESMAN
7698 20-FEB-81
1600
300
30
SALESMAN
7698 22-FEB-81
1250
500
30
Selezionate 14 righe.
143
USING EMP
ON (emp.empno=myemp.empno)
altrimenti...
INSERT (empno, ename, job, mgr, hiredate, sal, comm, deptno)
etc..
esegui questo INSERT.
C' qualche clausola della MERGE che non stata utilizzata
nell'esempio.
All'UPDATE pu essere aggiunta una clausola WHERE per
aggiornare solo determinati record. Se, per esempio, vogliamo
aggiornare il record solo se lo stipendio nuovo maggiore di quello
vecchio faremo:
MERGE into MYEMP
USING EMP
ON (emp.empno=myemp.empno)
WHEN MATCHED THEN
UPDATE SET
ename
= emp.ename,
job
= emp.job,
mgr
= emp.mgr,
hiredate = emp.hiredate,
sal
= emp.sal,
comm
= emp.comm,
deptno
= emp.deptno
WHERE sal < emp.sal
WHEN NOT MATCHED THEN
INSERT (empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES (emp.empno, emp.ename, emp.job, emp.mgr, emp.hiredate,
emp.sal, emp.comm, emp.deptno)
;
144
14 di righe unite.
WTO>
EMPNO
----7566
7654
7698
7782
7788
7839
7844
7876
7902
7934
7369
7499
7521
ENAME
-------JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
FORD
MILLER
SMITH
ALLEN
WARD
JOB
MGR HIREDATE
SAL
COMM DEPTNO
--------- ----- --------- ------ ------ ------MANAGER
7839 02-APR-81
2975
20
SALESMAN
7698 28-SET-81
1250
1400
30
MANAGER
7839 01-MAG-81
2850
30
MANAGER
7839 09-GIU-81
2450
10
ANALYST
7566 09-DIC-82
3000
20
PRESIDENT
17-NOV-81
5000
10
SALESMAN
7698 08-SET-81
1500
0
30
CLERK
7788 12-GEN-83
1100
20
ANALYST
7566 03-DIC-81
3000
20
CLERK
7782 23-GEN-82
1300
10
CLERK
7902 17-DIC-80
800
20
SALESMAN
7698 20-FEB-81
1600
300
30
SALESMAN
7698 22-FEB-81
1250
500
30
Selezionate 13 righe.
145
13 di righe unite.
WTO>
EMPNO
----7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
7499
7521
ENAME
---------JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
ALLEN
WARD
JOB
MGR HIREDATE
SAL
COMM DEPTNO
--------- ---- --------- ------- ------- ------MANAGER
7839 02-APR-81
2975
20
SALESMAN
7698 28-SET-81
1250
1400
30
MANAGER
7839 01-MAG-81
2850
30
MANAGER
7839 09-GIU-81
2450
10
ANALYST
7566 09-DIC-82
3000
20
PRESIDENT
17-NOV-81
5000
10
SALESMAN
7698 08-SET-81
1500
0
30
CLERK
7788 12-GEN-83
1100
20
CLERK
7698 03-DIC-81
950
30
ANALYST
7566 03-DIC-81
3000
20
CLERK
7782 23-GEN-82
1300
10
SALESMAN
7698 20-FEB-81
1600
300
30
SALESMAN
7698 22-FEB-81
1250
500
30
Selezionate 13 righe.
146
Type
---------------------------NUMBER(4)
VARCHAR2(10)
VARCHAR2(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NUMBER(2)
Type
---------------------------NUMBER(4)
VARCHAR2(10)
VARCHAR2(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NUMBER(2)
147
Type
--------------------------NUMBER(4)
VARCHAR2(5)
VARCHAR2(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NUMBER(2)
148
149
Type
----------VARCHAR2
VARCHAR2
VARCHAR2
VARCHAR2
BOOLEAN
In/Out
-----IN
IN
IN
IN
IN
Default?
-------DEFAULT
DEFAULT
DEFAULT
DEFAULT
Type
---------------NUMBER
VARCHAR2(2000)
ROWID
VARCHAR2(2)
VARCHAR2(2000)
VARCHAR2(4000)
VARCHAR2(4000)
VARCHAR2(4000)
VARCHAR2(4000)
VARCHAR2(4000)
VARCHAR2(4000)
VARCHAR2(4000)
VARCHAR2(4000)
150
WTO>
2
3
4
2 rows created.
WTO> select count(0) from ERR$_EMP2;
COUNT(0)
---------12
151
2 rows created.
WTO>
2
3
4
ORA_ERR_TAG$
COUNT(0)
------------------------------ ---------12
2010-02-05 18:54:31
12
ins2
12
152
WTO> select EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
2 from ERR$_EMP2
3 where ORA_ERR_TAG$ = 'ins2';
EMPNO
----7369
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
ENAME
---------SMITH
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
JOB
---------CLERK
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
MGR
----7902
7839
7698
7839
7839
7566
7698
7788
7698
7566
7782
HIREDATE
---------17-DEC-80
02-APR-81
28-SEP-81
01-MAY-81
09-JUN-81
19-APR-87
17-NOV-81
08-SEP-81
23-MAY-87
03-DEC-81
03-DEC-81
23-JAN-82
SAL
COMM
------ -----800
2975
1250
1400
2850
2450
3000
5000
1500
0
1100
950
3000
1300
DEPTNO
-----20
20
30
30
10
20
10
30
20
30
20
10
12 rows selected.
7.4
NOME
-------MARCO
GIOVANNI
MATTEO
LUCA
AMBROGIO
GENNARO
PASQUALE
VINCENZO
COGNOME
-------ROSSI
BIANCHI
VERDI
NERI
COLOMBO
ESPOSITO
RUSSO
AMATO
COD_FISC
INDIRIZZO
---------------- ---------------------RSSMRC70R20H501X VIA LAURENTINA, 700
VIA OSTIENSE, 850
VRDMTT69S02H501X VIA DEL MARE, 8
NRILCU77A22F205X VIA TORINO, 30
PIAZZA DUOMO, 1
SPSGNN71B10F839X VIA CARACCIOLO, 100
RSSPSQ70C14F839X VIA GIULIO CESARE, 119
VIA NAPOLI, 234
CAP
----00143
00144
00033
20120
20100
80100
80125
80022
COMU
---H501
H501
G811
F205
F205
F839
F839
G964
Selezionate 8 righe.
153
Proiezioni
solo
le
colonne
INDIRIZZO
---------------------VIA LAURENTINA, 700
VIA OSTIENSE, 850
VIA DEL MARE, 8
VIA TORINO, 30
PIAZZA DUOMO, 1
VIA CARACCIOLO, 100
VIA GIULIO CESARE, 119
VIA NAPOLI, 234
Selezionate 8 righe.
I
----------------------------VIA LAURENTINA, 700
VIA OSTIENSE, 850
VIA DEL MARE, 8
VIA TORINO, 30
PIAZZA DUOMO, 1
VIA CARACCIOLO, 100
VIA GIULIO CESARE, 119
VIA NAPOLI, 234
Selezionate 8 righe.
154
I
----------------------------VIA LAURENTINA, 700
VIA OSTIENSE, 850
VIA DEL MARE, 8
VIA TORINO, 30
PIAZZA DUOMO, 1
VIA CARACCIOLO, 100
VIA GIULIO CESARE, 119
VIA NAPOLI, 234
Selezionate 8 righe.
155
7.4.2
La tabella DUAL
156
157
7.4.3
Pseudo colonne
158
CONNECT_BY_ISCYCLE
CONNECT_BY_ISLEAF
LEVEL
Le pseudo colonne
COLUMN_VALUE
XMLDATA
ROWID
-----------------AAAlsNAAEAAA7gkAAA
AAAlsNAAEAAA7gkAAB
AAAlsNAAEAAA7gkAAC
AAAlsNAAEAAA7gkAAD
AAAlsNAAEAAA7gkAAE
AAAlsNAAEAAA7gkAAF
AAAlsNAAEAAA7gkAAG
AAAlsNAAEAAA7gkAAH
Selezionate 8 righe.
159
Selezioni
160
Operatori di confronto
Valori fissi
Operatori aritmetici
Operatori logici
Pseudo colonne
DES_COMUNE
-------------------------------------------------ROMA
POMEZIA
FIUMICINO
PR
-RM
RM
RM
DES_COMUNE
-------------------------------------------------MILANO
PIOLTELLO
LAINATE
NAPOLI
POZZUOLI
PORTICI
PR
-MI
MI
MI
NA
NA
NA
Selezionate 6 righe.
WTO >select * from comuni
2 where provincia<>'RM';
COD_
---F205
G686
E415
F839
G964
G902
DES_COMUNE
-------------------------------------------------MILANO
PIOLTELLO
LAINATE
NAPOLI
POZZUOLI
PORTICI
PR
-MI
MI
MI
NA
NA
NA
Selezionate 6 righe.
161
DES_COMUNE
-------------------------------------------------MILANO
PIOLTELLO
LAINATE
NAPOLI
POZZUOLI
PORTICI
PR
-MI
MI
MI
NA
NA
NA
Selezionate 6 righe.
NOME
-------MARCO
GIOVANNI
MATTEO
LUCA
AMBROGIO
GENNARO
PASQUALE
VINCENZO
COGNOME
-------ROSSI
BIANCHI
VERDI
NERI
COLOMBO
ESPOSITO
RUSSO
AMATO
COD_FISC
INDIRIZZO
---------------- ---------------------RSSMRC70R20H501X VIA LAURENTINA, 700
VIA OSTIENSE, 850
VRDMTT69S02H501X VIA DEL MARE, 8
NRILCU77A22F205X VIA TORINO, 30
PIAZZA DUOMO, 1
SPSGNN71B10F839X VIA CARACCIOLO, 100
RSSPSQ70C14F839X VIA GIULIO CESARE, 119
VIA NAPOLI, 234
CAP
----00143
00144
00033
20120
20100
80100
80125
80022
COMU
---H501
H501
G811
F205
F205
F839
F839
G964
Selezionate 8 righe.
WTO >select * from clienti
2 where cod_fisc = NULL;
Nessuna riga selezionata
WTO >select * from clienti
2 where cod_fisc != NULL;
Nessuna riga selezionata
162
NOME
-------MARCO
GIOVANNI
MATTEO
LUCA
AMBROGIO
GENNARO
PASQUALE
VINCENZO
COGNOME
-------ROSSI
BIANCHI
VERDI
NERI
COLOMBO
ESPOSITO
RUSSO
AMATO
COD_FISC
INDIRIZZO
---------------- ---------------------RSSMRC70R20H501X VIA LAURENTINA, 700
VIA OSTIENSE, 850
VRDMTT69S02H501X VIA DEL MARE, 8
NRILCU77A22F205X VIA TORINO, 30
PIAZZA DUOMO, 1
SPSGNN71B10F839X VIA CARACCIOLO, 100
RSSPSQ70C14F839X VIA GIULIO CESARE, 119
VIA NAPOLI, 234
CAP
----00143
00144
00033
20120
20100
80100
80125
80022
COMU
---H501
H501
G811
F205
F205
F839
F839
G964
Selezionate 8 righe.
WTO >select * from clienti
2 where cod_fisc = 'RSSMRC70R20H501X';
COD NOME
COGNOME COD_FISC
INDIRIZZO
CAP
COMU
--- -------- -------- ---------------- ---------------------- ----- ---1 MARCO
ROSSI
RSSMRC70R20H501X VIA LAURENTINA, 700
00143 H501
NOME
-------MATTEO
LUCA
GENNARO
PASQUALE
COGNOME
-------VERDI
NERI
ESPOSITO
RUSSO
COD_FISC
---------------VRDMTT69S02H501X
NRILCU77A22F205X
SPSGNN71B10F839X
RSSPSQ70C14F839X
INDIRIZZO
---------------------VIA DEL MARE, 8
VIA TORINO, 30
VIA CARACCIOLO, 100
VIA GIULIO CESARE, 119
CAP
----00033
20120
80100
80125
COMU
---G811
F205
F839
F839
NOME
-------GIOVANNI
AMBROGIO
VINCENZO
COGNOME COD_FISC
-------- ---------------BIANCHI
COLOMBO
AMATO
INDIRIZZO
---------------------VIA OSTIENSE, 850
PIAZZA DUOMO, 1
VIA NAPOLI, 234
CAP
----00144
20100
80022
COMU
---H501
F205
G964
163
NOME
-------MARCO
MATTEO
LUCA
GENNARO
PASQUALE
COGNOME
-------ROSSI
VERDI
NERI
ESPOSITO
RUSSO
COD_FISC
---------------RSSMRC70R20H501X
VRDMTT69S02H501X
NRILCU77A22F205X
SPSGNN71B10F839X
RSSPSQ70C14F839X
INDIRIZZO
---------------------VIA LAURENTINA, 700
VIA DEL MARE, 8
VIA TORINO, 30
VIA CARACCIOLO, 100
VIA GIULIO CESARE, 119
CAP
----00143
00033
20120
80100
80125
COMU
---H501
G811
F205
F839
F839
164
165
Per
osservare
questo
comportamento
cambiamo
momentaneamente il formato di visualizzazione di default delle date
con il comando
WTO >ALTER SESSION SET NLS_DATE_FORMAT='dd/mm/yyyy hh24:mi:ss';
Modificata sessione.
166
DES_COMUNE
-------------------------------------------------ROMA
POMEZIA
PIOLTELLO
NAPOLI
POZZUOLI
PORTICI
PR
-RM
RM
MI
NA
NA
NA
Selezionate 6 righe.
167
DES_COMUNE
-------------------------------------------------ROMA
POMEZIA
MILANO
PIOLTELLO
NAPOLI
POZZUOLI
PORTICI
PR
-RM
RM
MI
MI
NA
NA
NA
Selezionate 7 righe.
WTO >select * from comuni
2 where des_comune<'MILANO';
COD_
---M297
E415
DES_COMUNE
-------------------------------------------------FIUMICINO
LAINATE
PR
-RM
MI
DES_COMUNE
-------------------------------------------------FIUMICINO
MILANO
LAINATE
PR
-RM
MI
MI
168
DES_COMUNE
-------------------------------------------------ROMA
POMEZIA
FIUMICINO
MILANO
PIOLTELLO
LAINATE
PR
-RM
RM
RM
MI
MI
MI
Selezionate 6 righe.
WTO >select * from fatture
2 where importo in (300,700);
NUM_FATTURA NUM_ORDINE DATA_FATT
IMPORTO P
----------- ---------- --------- ---------- 1
1 01-OTT-10
300 S
3
2 20-OTT-10
700 S
WTO >select * from fatture
2 where data_fattura in (date'2011-02-01', date'2010-10-20');
NUM_FATTURA NUM_ORDINE DATA_FATT
IMPORTO P
----------- ---------- --------- ---------- 3
2 20-OTT-10
700 S
4
3 01-FEB-11
1000 N
169
DES_COMUNE
-------------------------------------------------NAPOLI
POZZUOLI
PORTICI
PR
-NA
NA
NA
DES_COMUNE
-------------------------------------------------POMEZIA
PIOLTELLO
POZZUOLI
PORTICI
PR
-RM
MI
NA
NA
DES_COMUNE
-------------------------------------------------ROMA
POMEZIA
PR
-RM
RM
170
DES_COMUNE
-------------------------------------------------FIUMICINO
MILANO
PIOLTELLO
PR
-RM
MI
MI
DES_COMUNE
-------------------------------------------------PIOLTELLO
NAPOLI
POZZUOLI
PR
-MI
NA
NA
DES_COMUNE
-------------------------------------------------FIUMICINO
MILANO
LAINATE
NAPOLI
PR
-RM
MI
MI
NA
DES_COMUNE
-------------------------------------------------PIOLTELLO
POZZUOLI
PR
-MI
NA
171
DES_COMUNE
-------------------------------------------------ROMA
FIUMICINO
MILANO
LAINATE
NAPOLI
PR
-RM
RM
MI
MI
NA
DES_COMUNE
-------------------------------------------------FIUMICINO
MILANO
PIOLTELLO
LAINATE
NAPOLI
POZZUOLI
PORTICI
PR
-RM
MI
MI
MI
NA
NA
NA
Selezionate 7 righe.
WTO >select * from comuni
2 where des_comune not like '%O';
COD_
---H501
G811
E415
F839
G964
G902
DES_COMUNE
-------------------------------------------------ROMA
POMEZIA
LAINATE
NAPOLI
POZZUOLI
PORTICI
PR
-RM
RM
MI
NA
NA
NA
Selezionate 6 righe.
WTO >select * from comuni
2 where des_comune not like '%O%L%';
COD_
---H501
G811
M297
F205
E415
G902
DES_COMUNE
-------------------------------------------------ROMA
POMEZIA
FIUMICINO
MILANO
LAINATE
PORTICI
Selezionate 6 righe.
172
PR
-RM
RM
RM
MI
MI
NA
DES_COMUNE
-------------------------------------------------ROMA
POMEZIA
PIOLTELLO
POZZUOLI
PORTICI
PR
-RM
RM
MI
NA
NA
DES_COMUNE
-------------------------------------------------ROMA
POMEZIA
FIUMICINO
MILANO
LAINATE
NAPOLI
PORTICI
PR
-RM
RM
RM
MI
MI
NA
NA
Selezionate 7 righe.
Congiunzione (AND)
10.8) di INTERSEZIONE.
PR
-RM
RM
RM
MI
MI
MI
NA
NA
NA
Selezionate 9 righe.
173
Eseguendo la query:
WTO >select * from comuni
2 where des_comune like 'P%';
COD_
---G811
G686
G964
G902
DES_COMUNE
-------------------------------------------------POMEZIA
PIOLTELLO
POZZUOLI
PORTICI
PR
-RM
MI
NA
NA
Eseguendo la query:
WTO >select * from comuni
2 where provincia = 'NA';
COD_
---F839
G964
G902
DES_COMUNE
-------------------------------------------------NAPOLI
POZZUOLI
PORTICI
PR
-NA
NA
NA
DES_COMUNE
-------------------------------------------------POZZUOLI
PORTICI
PR
-NA
NA
Disgiunzione (OR)
174
DES_COMUNE
-------------------------------------------------POMEZIA
PIOLTELLO
NAPOLI
POZZUOLI
PORTICI
PR
-RM
MI
NA
NA
NA
Negazione (NOT)
DES_COMUNE
-------------------------------------------------ROMA
POMEZIA
FIUMICINO
MILANO
PIOLTELLO
LAINATE
PR
-RM
RM
RM
MI
MI
MI
Selezionate 6 righe.
DES_COMUNE
-------------------------------------------------ROMA
POMEZIA
FIUMICINO
MILANO
PIOLTELLO
LAINATE
PR
-RM
RM
RM
MI
MI
MI
Selezionate 6 righe.
175
NOME
-------MARCO
PASQUALE
COGNOME
-------ROSSI
RUSSO
COD_FISC
---------------RSSMRC70R20H501X
RSSPSQ70C14F839X
INDIRIZZO
---------------------VIA LAURENTINA, 700
VIA GIULIO CESARE, 119
CAP
----00143
80125
COMU
---H501
F839
NOME
-------MATTEO
LUCA
GENNARO
COGNOME
-------VERDI
NERI
ESPOSITO
COD_FISC
---------------VRDMTT69S02H501X
NRILCU77A22F205X
SPSGNN71B10F839X
INDIRIZZO
---------------------VIA DEL MARE, 8
VIA TORINO, 30
VIA CARACCIOLO, 100
CAP
----00033
20120
80100
COMU
---G811
F205
F839
CAP
----00144
20100
80022
COMU
---H501
F205
G964
NOME
-------GIOVANNI
AMBROGIO
VINCENZO
COGNOME COD_FISC
-------- ---------------BIANCHI
COLOMBO
AMATO
INDIRIZZO
---------------------VIA OSTIENSE, 850
PIAZZA DUOMO, 1
VIA NAPOLI, 234
e
NOT (<prima condizione> OR <seconda condizione>)
equivalente a
NOT <prima condizione> AND NOT <seconda condizione>
DES_COMUNE
-------------------------------------------------ROMA
POMEZIA
FIUMICINO
MILANO
PIOLTELLO
LAINATE
NAPOLI
Selezionate 7 righe.
176
PR
-RM
RM
RM
MI
MI
MI
NA
DES_COMUNE
-------------------------------------------------ROMA
POMEZIA
FIUMICINO
MILANO
PIOLTELLO
LAINATE
NAPOLI
PR
-RM
RM
RM
MI
MI
MI
NA
Selezionate 7 righe.
WTO >select * from comuni
2 where provincia != 'NA' or des_comune not like 'P%';
COD_
---H501
G811
M297
F205
G686
E415
F839
DES_COMUNE
-------------------------------------------------ROMA
POMEZIA
FIUMICINO
MILANO
PIOLTELLO
LAINATE
NAPOLI
PR
-RM
RM
RM
MI
MI
MI
NA
Selezionate 7 righe.
DES_COMUNE
-------------------------------------------------ROMA
FIUMICINO
MILANO
LAINATE
PR
-RM
RM
MI
MI
DES_COMUNE
-------------------------------------------------ROMA
FIUMICINO
MILANO
LAINATE
PR
-RM
RM
MI
MI
177
DES_COMUNE
-------------------------------------------------ROMA
FIUMICINO
MILANO
LAINATE
PR
-RM
RM
MI
MI
DES_COMUNE
-------------------------------------------------PIOLTELLO
NAPOLI
POZZUOLI
PORTICI
PR
-MI
NA
NA
NA
DES_COMUNE
-------------------------------------------------PIOLTELLO
NAPOLI
POZZUOLI
PORTICI
PR
-MI
NA
NA
NA
178
DES_COMUNE
-------------------------------------------------PIOLTELLO
POZZUOLI
PORTICI
7.4.5
PR
-MI
NA
NA
Ordinamento
Nomi di colonna
Alias di colonna
179
NOME
-------AMBROGIO
GENNARO
GIOVANNI
LUCA
MARCO
MATTEO
PASQUALE
VINCENZO
COGNOME
-------COLOMBO
ESPOSITO
BIANCHI
NERI
ROSSI
VERDI
RUSSO
AMATO
COD_FISC
INDIRIZZO
---------------- ---------------------PIAZZA DUOMO, 1
SPSGNN71B10F839X VIA CARACCIOLO, 100
VIA OSTIENSE, 850
NRILCU77A22F205X VIA TORINO, 30
RSSMRC70R20H501X VIA LAURENTINA, 700
VRDMTT69S02H501X VIA DEL MARE, 8
RSSPSQ70C14F839X VIA GIULIO CESARE, 119
VIA NAPOLI, 234
CAP
----20100
80100
00144
20120
00143
00033
80125
80022
COMU
---F205
F839
H501
F205
H501
G811
F839
G964
Selezionate 8 righe.
NOME
-------AMBROGIO
LUCA
GENNARO
PASQUALE
MATTEO
VINCENZO
GIOVANNI
MARCO
COGNOME
-------COLOMBO
NERI
ESPOSITO
RUSSO
VERDI
AMATO
BIANCHI
ROSSI
COD_FISC
INDIRIZZO
---------------- ---------------------PIAZZA DUOMO, 1
NRILCU77A22F205X VIA TORINO, 30
SPSGNN71B10F839X VIA CARACCIOLO, 100
RSSPSQ70C14F839X VIA GIULIO CESARE, 119
VRDMTT69S02H501X VIA DEL MARE, 8
VIA NAPOLI, 234
VIA OSTIENSE, 850
RSSMRC70R20H501X VIA LAURENTINA, 700
CAP
----20100
20120
80100
80125
00033
80022
00144
00143
COMU
---F205
F205
F839
F839
G811
G964
H501
H501
Selezionate 8 righe.
INDIRIZZO
---------------------PIAZZA DUOMO, 1
VIA TORINO, 30
VIA CARACCIOLO, 100
VIA GIULIO CESARE, 119
VIA DEL MARE, 8
VIA NAPOLI, 234
VIA OSTIENSE, 850
VIA LAURENTINA, 700
Selezionate 8 righe.
180
INDIRIZZO
---------------------VIA DEL MARE, 8
VIA LAURENTINA, 700
VIA OSTIENSE, 850
PIAZZA DUOMO, 1
VIA TORINO, 30
VIA NAPOLI, 234
VIA CARACCIOLO, 100
VIA GIULIO CESARE, 119
Selezionate 8 righe.
NOME
-------AMBROGIO
GENNARO
GIOVANNI
LUCA
MARCO
MATTEO
PASQUALE
VINCENZO
COGNOME
-------COLOMBO
ESPOSITO
BIANCHI
NERI
ROSSI
VERDI
RUSSO
AMATO
COD_FISC
INDIRIZZO
---------------- ---------------------PIAZZA DUOMO, 1
SPSGNN71B10F839X VIA CARACCIOLO, 100
VIA OSTIENSE, 850
NRILCU77A22F205X VIA TORINO, 30
RSSMRC70R20H501X VIA LAURENTINA, 700
VRDMTT69S02H501X VIA DEL MARE, 8
RSSPSQ70C14F839X VIA GIULIO CESARE, 119
VIA NAPOLI, 234
CAP
----20100
80100
00144
20120
00143
00033
80125
80022
COMU
---F205
F839
H501
F205
H501
G811
F839
G964
Selezionate 8 righe.
C
----------------------AMATO
BIANCHI
COLOMBO
ESPOSITO
NERI
ROSSI
RUSSO
VERDI
INDIRIZZO
---------------------VIA NAPOLI, 234
VIA OSTIENSE, 850
PIAZZA DUOMO, 1
VIA CARACCIOLO, 100
VIA TORINO, 30
VIA LAURENTINA, 700
VIA GIULIO CESARE, 119
VIA DEL MARE, 8
Selezionate 8 righe.
181
NOME
-------MATTEO
PASQUALE
MARCO
LUCA
GENNARO
AMBROGIO
GIOVANNI
VINCENZO
COGNOME
-------VERDI
RUSSO
ROSSI
NERI
ESPOSITO
COLOMBO
BIANCHI
AMATO
COD_FISC
---------------VRDMTT69S02H501X
RSSPSQ70C14F839X
RSSMRC70R20H501X
NRILCU77A22F205X
SPSGNN71B10F839X
INDIRIZZO
---------------------VIA DEL MARE, 8
VIA GIULIO CESARE, 119
VIA LAURENTINA, 700
VIA TORINO, 30
VIA CARACCIOLO, 100
PIAZZA DUOMO, 1
VIA OSTIENSE, 850
VIA NAPOLI, 234
CAP
----00033
80125
00143
20120
80100
20100
00144
80022
COMU
---G811
F839
H501
F205
F839
F205
H501
G964
Selezionate 8 righe.
NOME
-------GIOVANNI
MARCO
VINCENZO
MATTEO
GENNARO
PASQUALE
AMBROGIO
LUCA
COGNOME
-------BIANCHI
ROSSI
AMATO
VERDI
ESPOSITO
RUSSO
COLOMBO
NERI
COD_FISC
INDIRIZZO
---------------- ---------------------VIA OSTIENSE, 850
RSSMRC70R20H501X VIA LAURENTINA, 700
VIA NAPOLI, 234
VRDMTT69S02H501X VIA DEL MARE, 8
SPSGNN71B10F839X VIA CARACCIOLO, 100
RSSPSQ70C14F839X VIA GIULIO CESARE, 119
PIAZZA DUOMO, 1
NRILCU77A22F205X VIA TORINO, 30
CAP
----00144
00143
80022
00033
80100
80125
20100
20120
COMU
---H501
H501
G964
G811
F839
F839
F205
F205
Selezionate 8 righe.
182
NOME
-------LUCA
MARCO
PASQUALE
GENNARO
MATTEO
GIOVANNI
VINCENZO
AMBROGIO
COGNOME
-------NERI
ROSSI
RUSSO
ESPOSITO
VERDI
BIANCHI
AMATO
COLOMBO
COD_FISC
---------------NRILCU77A22F205X
RSSMRC70R20H501X
RSSPSQ70C14F839X
SPSGNN71B10F839X
VRDMTT69S02H501X
INDIRIZZO
---------------------VIA TORINO, 30
VIA LAURENTINA, 700
VIA GIULIO CESARE, 119
VIA CARACCIOLO, 100
VIA DEL MARE, 8
VIA OSTIENSE, 850
VIA NAPOLI, 234
PIAZZA DUOMO, 1
CAP
----20120
00143
80125
80100
00033
00144
80022
20100
COMU
---F205
H501
F839
F839
G811
H501
G964
F205
CAP
----00144
20100
80022
20120
00143
80125
80100
00033
COMU
---H501
F205
G964
F205
H501
F839
F839
G811
Selezionate 8 righe.
WTO >select * from clienti
2 order by cod_fisc nulls first;
COD
--2
5
8
4
1
7
6
3
NOME
-------GIOVANNI
AMBROGIO
VINCENZO
LUCA
MARCO
PASQUALE
GENNARO
MATTEO
COGNOME
-------BIANCHI
COLOMBO
AMATO
NERI
ROSSI
RUSSO
ESPOSITO
VERDI
COD_FISC
INDIRIZZO
---------------- ---------------------VIA OSTIENSE, 850
PIAZZA DUOMO, 1
VIA NAPOLI, 234
NRILCU77A22F205X VIA TORINO, 30
RSSMRC70R20H501X VIA LAURENTINA, 700
RSSPSQ70C14F839X VIA GIULIO CESARE, 119
SPSGNN71B10F839X VIA CARACCIOLO, 100
VRDMTT69S02H501X VIA DEL MARE, 8
Selezionate 8 righe.
7.4.6
Raggruppamenti
183
184
SUM
185
MIN
MAX
186
AVG
VARIANCE
187
STDDEV
COUNT
188
189
190
Tipo
---------------NUMBER(4)
VARCHAR2(10)
VARCHAR2(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NUMBER(2)
JOB
SUM(SAL)
--------- ---------CLERK
1900
SALESMAN
5600
MANAGER
2975
CLERK
950
PRESIDENT
5000
MANAGER
2850
CLERK
1300
MANAGER
2450
ANALYST
6000
Selezionate 9 righe.
191
JOB
SUM(SAL)
--------- ---------CLERK
1300
MANAGER
2450
PRESIDENT
5000
8750
CLERK
1900
ANALYST
6000
MANAGER
2975
10875
CLERK
950
MANAGER
2850
SALESMAN
5600
9400
Selezionate 12 righe.
invece di
JOB
192
JOB
SUM(SAL)
-------------------- ---------CLERK
1300
MANAGER
2450
PRESIDENT
5000
Tot. 10
8750
CLERK
1900
ANALYST
6000
MANAGER
2975
Tot. 20
10875
CLERK
950
MANAGER
2850
SALESMAN
5600
Tot. 30
9400
Selezionate 12 righe.
Dove
nvl(job,'
Tot. '||deptno)
JOB
SUM(SAL)
-------------------- ---------CLERK
1300
MANAGER
2450
PRESIDENT
5000
Tot. 10
8750
CLERK
1900
ANALYST
6000
MANAGER
2975
Tot. 20
10875
CLERK
950
MANAGER
2850
SALESMAN
5600
Tot. 30
9400
Tot.
29025
Selezionate 13 righe.
193
WTO>
2
3
4
DEPTNO
---------10
10
10
10
20
20
20
20
30
30
30
30
JOB
SUM(SAL)
-------------------- ---------CLERK
1300
MANAGER
2450
PRESIDENT
5000
Tot. 10
8750
CLERK
1900
ANALYST
6000
MANAGER
2975
Tot. 20
10875
CLERK
950
MANAGER
2850
SALESMAN
5600
Tot. 30
9400
Tot. Complessivo
29025
Selezionate 13 righe.
7.4.7
Tornando su ROWNUM
194
che
ha
senso
con
ROWNUM
Ma perch la query
WTO >select cognome, rownum
2 from clienti
3 where rownum>3;
Nessuna riga selezionata
195
7.4.8
196
197
198
WTO>
2
3
4
5
6
7
8
select *
from vendite
UNPIVOT
(importo for anno in (
anno_2008 as '2008',
anno_2009 as '2009',
anno_2010 as '2010')
);
DEPTNO
---------10
10
10
20
20
20
30
30
30
ANNO
IMPORTO
---- ---------2008
350000
2009
400000
2010
500000
2008
185000
2009
220000
2010
330000
2008
400000
2009
500000
2010
600000
9 rows selected.
199
WTO>
2
3
4
5
6
7
8
select *
from vendite
UNPIVOT
(importo for anno in (
anno_2008 as 2008,
anno_2009 as 2009,
anno_2010 as 2010)
);
DEPTNO
---------10
10
10
20
20
30
30
30
ANNO
IMPORTO
---- ---------2008
350000
2009
400000
2010
500000
2008
185000
2009
220000
2008
400000
2009
500000
2010
600000
8 rows selected.
select *
from vendite
UNPIVOT INCLUDE NULLS
(importo for anno in (
anno_2008 as 2008,
anno_2009 as 2009,
anno_2010 as 2010)
);
DEPTNO
---------10
10
10
20
20
20
30
30
30
ANNO
IMPORTO
---- ---------2008
350000
2009
400000
2010
500000
2008
185000
2009
220000
2010
2008
400000
2009
500000
2010
600000
9 rows selected.
200
WTO>
2
3
4
5
6
7
8
9
7.4.9
Query gerarchiche
ENAME
MGR
---------- ---------SMITH
7902
ALLEN
7698
WARD
7698
JONES
7839
MARTIN
7698
BLAKE
7839
201
7782
7788
7839
7844
7876
7900
7902
7934
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
7839
7566
7698
7788
7698
7566
7782
EMPNO
---------7839
7566
7788
7876
7902
7369
7698
7499
7521
7654
7844
7900
7782
7934
ENAME
MGR PRIORENAME
LEVEL
---------- ---------- ---------- ---------KING
1
JONES
7839 KING
2
SCOTT
7566 JONES
3
ADAMS
7788 SCOTT
4
FORD
7566 JONES
3
SMITH
7902 FORD
4
BLAKE
7839 KING
2
ALLEN
7698 BLAKE
3
WARD
7698 BLAKE
3
MARTIN
7698 BLAKE
3
TURNER
7698 BLAKE
3
JAMES
7698 BLAKE
3
CLARK
7839 KING
2
MILLER
7782 CLARK
3
202
203
Abbiamo detto che KING figlio di SMITH, che per a sua volta
pronipote di KING. Che succede, dunque, se rieseguiamo la query
precedente?
WTO> select empno,lpad(' ',level*3,' ')||ename nome,
2
mgr, prior ename, level
3
from emp
4 connect by prior empno = mgr
5
start with mgr is null
6 order siblings by ename;
Nessuna riga selezionata
Certo, perch non c' nessun record con MGR NULL. Allora
cambiamo la START WITH come segue:
WTO> select empno,lpad(' ',level*3,' ')||ename nome,
2
mgr, prior ename, level
3
from emp
4 connect by prior empno = mgr
5
start with empno=7839;
ERROR:
ORA-01436: CONNECT BY in loop sui dati utente
Nessuna riga selezionata
204
205
BOSS
---------KING
KING
KING
KING
KING
KING
KING
KING
KING
KING
KING
KING
KING
KING
Selezionate 14 righe.
206
BOSS
---------BLAKE
BLAKE
BLAKE
BLAKE
BLAKE
BLAKE
KING
KING
KING
KING
KING
KING
KING
KING
CAPI
-------------------------------/KING
/KING/JONES
/KING/JONES/SCOTT
/KING/JONES/SCOTT/ADAMS
/KING/JONES/FORD
/KING/JONES/FORD/SMITH
/KING/BLAKE
/KING/BLAKE/ALLEN
/KING/BLAKE/WARD
/KING/BLAKE/MARTIN
/KING/BLAKE/TURNER
/KING/BLAKE/JAMES
/KING/CLARK
/KING/CLARK/MILLER
207
pseudo
colonna
molto
interessante,
208
ENAMES
---------------------------------------CLARK,KING,MILLER
SMITH,JONES,SCOTT,ADAMS,FORD
ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES
209
NAME
COD
---- ---------pera
1112
pera
2101
pera
3114
pera
4097
210
S
D
D
D
D
D
D
D
D
D
A
A
A
D
A
CATEGORIA
-------------------CASA
PERSONALI
AUTO
AUTO
AUTO
AUTO
AUTO
AUTO
CASA
STIPENDI
STIPENDI
STIPENDI
REGALI
REGALI
DESCRIZIONE
IMPORTO
----------------- ---------RATA MUTUO
500
VACANZA
1000
PIENO
60
PIENO
60
PIENO
60
PIENO
60
PIENO
60
PIENO
60
RATA MUTUO
510
13esima
2000
Dicembre
2200
Gennaio
2400
Natale
800
Natale
200
14 rows selected.
211
S
D
D
D
D
D
A
A
D
A
CATEGORIA
IMPORTO
-------------------- ---------AUTO
180
CASA
500
PERSONALI
1000
REGALI
800
CASA
510
STIPENDI
2400
STIPENDI
4200
AUTO
180
REGALI
200
Selezionate 9 righe.
Partizioni
Dimensioni
Misure
212
ANNO
---2009
2009
2009
2009
2009
2009
2009
2009
2010
2010
2010
2010
2010
S
A
A
A
D
D
D
D
D
A
A
D
D
D
CATEGORIA
IMPORTO
-------------------- ---------REGALI
200
STIPENDI
4200
TOTALE AVERE
4400
AUTO
180
CASA
500
PERSONALI
1000
REGALI
800
TOTALE CASA e AUTO
680
STIPENDI
2400
TOTALE AVERE
AUTO
180
CASA
510
TOTALE CASA e AUTO
690
13 rows selected.
213
ANNO
---2009
2009
2009
2009
2009
2009
2009
2009
2010
2010
2010
2010
2010
S
A
A
A
D
D
D
D
D
A
A
D
D
D
CATEGORIA
IMPORTO
-------------------- ---------REGALI
200
STIPENDI
4200
TOTALE AVERE
4400
AUTO
180
CASA
500
PERSONALI
1000
REGALI
800
TOTALE CASA e AUTO
680
STIPENDI
2400
TOTALE AVERE
2400
AUTO
180
CASA
510
TOTALE CASA e AUTO
690
13 rows selected.
214
WTO>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ANNO
---2009
2009
2009
2009
2009
2009
2009
2009
2009
2010
2010
2010
2010
2010
2010
S
A
A
A
D
D
D
D
D
D
A
A
D
D
D
D
CATEGORIA
IMPORTO
-------------------- ---------REGALI
200
STIPENDI
4200
TOTALE AVERE
4400
AUTO
180
CASA
500
PERSONALI
1000
REGALI
800
TOTALE CASA e AUTO
680
TOTALE DARE
3160
STIPENDI
2400
TOTALE AVERE
2400
AUTO
180
CASA
510
TOTALE CASA e AUTO
690
TOTALE DARE
1380
15 rows selected.
UPDATE
UPSERT
215
UPSERT ALL
ANNO
---2009
2009
2009
2009
2009
2009
2009
2009
2010
2010
2010
2010
2010
S
A
A
A
D
D
D
D
D
A
A
D
D
D
CATEGORIA
IMPORTO
-------------------- ---------REGALI
200
STIPENDI
4200
TOTALE AVERE
4400
AUTO
180
CASA
500
PERSONALI
1000
REGALI
800
TOTALE CASA e AUTO
680
STIPENDI
2400
TOTALE AVERE
2400
AUTO
180
CASA
510
TOTALE CASA e AUTO
690
13 rows selected.
216
Rispetto a prima abbiamo perso due righe. I due totali dare per il
2009 ed il 2010.
Siccome la cella (D, TOTALE DARE) non esiste al momento
dell'estrazione, la regola in modalit UPDATE non l'aggiunge.
Se invece proviamo ad inserire in tabella un record fatto cos:
insert into bilancio_familiare values
(DATE '2009-12-25', 'D', 'TOTALE DARE', null,1000);
ANNO
---2009
2009
2009
2009
2009
2009
2009
2009
2009
2010
2010
2010
2010
2010
S
A
A
A
D
D
D
D
D
D
A
A
D
D
D
CATEGORIA
IMPORTO
-------------------- ---------REGALI
200
STIPENDI
4200
TOTALE AVERE
4400
AUTO
180
CASA
500
PERSONALI
1000
REGALI
800
TOTALE CASA e AUTO
680
TOTALE DARE
4160
STIPENDI
2400
TOTALE AVERE
2400
AUTO
180
CASA
510
TOTALE CASA e AUTO
690
14 rows selected.
217
ANNO
---2009
2009
2009
2009
2009
2009
2010
2010
2010
S
A
A
D
D
D
D
A
D
D
CATEGORIA
IMPORTO
-------------------- ---------REGALI
200
STIPENDI
4200
AUTO
180
CASA
500
PERSONALI
1000
REGALI
800
STIPENDI
2400
AUTO
180
CASA
510
Selezionate 9 righe.
WTO>
2
3
4
5
6
7
8
9
10
11
12
ANNO
---2009
2009
2009
2009
2009
2009
2009
2010
2010
2010
2010
S
A
A
A
D
D
D
D
A
A
D
D
CATEGORIA
IMPORTO
-------------------- ---------REGALI
200
STIPENDI
4200
TOTALE
4400
AUTO
180
CASA
500
PERSONALI
1000
REGALI
800
STIPENDI
2400
TOTALE
2400
AUTO
180
CASA
510
Selezionate 11 righe.
218
ANNO
---2009
2009
2009
2009
2009
2009
2009
2009
2009
2010
2010
2010
2010
2010
S
A
A
A
D
D
D
D
D
D
A
A
D
D
D
CATEGORIA
IMPORTO
-------------------- ---------REGALI
200
STIPENDI
4200
TOTALE AVERE
4400
AUTO
180
CASA
500
PERSONALI
1000
REGALI
800
TOTALE CASA e AUTO
680
TOTALE DARE
4160
STIPENDI
2400
TOTALE AVERE
2400
AUTO
180
CASA
510
TOTALE CASA e AUTO
690
14 rows selected.
219
ANNO
---2009
2009
2009
2009
2009
2009
2009
2009
2010
2010
2010
2010
2010
S
A
A
A
D
D
D
D
D
A
A
D
D
D
CATEGORIA
IMPORTO
-------------------- ---------REGALI
200
STIPENDI
4200
TOTALE AVERE
4400
AUTO
180
CASA
500
PERSONALI
1000
REGALI
800
TOTALE DARE
3480
STIPENDI
2400
TOTALE AVERE
2400
AUTO
180
CASA
510
TOTALE DARE
690
13 rows selected.
220
ANNO
---2009
2009
2009
2009
2009
2009
2009
2009
2010
2010
2010
2010
2010
S
A
A
A
D
D
D
D
D
A
A
D
D
D
CATEGORIA
IMPORTO
-------------------- ---------REGALI
200
STIPENDI
4200
TOTALE
4400
AUTO
180
CASA
500
PERSONALI
1000
REGALI
800
TOTALE
2480
STIPENDI
2400
TOTALE
2400
AUTO
180
CASA
510
TOTALE
690
Selezionate 13 righe.
7.5
Operatore di concatenazione
221
222
7.5.2
Operatori aritmetici
Sottrazione ()
Moltiplicazione (*)
Divisione (/)
223
7.5.3
CONCAT
La funzione
concatenazione.
CONCAT
equivalente
alloperatore
di
224
SUBSTR
SUB
--MAR
GIO
MAT
LUC
AMB
GEN
PAS
VIN
SUB
--RCO
OVA
TTE
CA
BRO
NNA
SQU
NCE
225
SUB
--RCO
NNI
TEO
UCA
GIO
ARO
ALE
NZO
Selezionate 8 righe.
SUBSTR(NOME,3)
---------------------------RCO
OVANNI
TTEO
CA
BROGIO
NNARO
SQUALE
NCENZO
Selezionate 8 righe.
226
SUB
--RCO
NNI
TEO
UCA
GIO
ARO
ALE
NZO
Selezionate 8 righe.
INSTR
227
LENGTH
228
16
16
SPSGNN71B10F839X
RSSPSQ70C14F839X
16
16
Selezionate 8 righe.
229
STRINGA
LTRIM('STRI
----------STRINGA
230
STRINGA
STRINGA
STRINGA
RTRIM('STRIN
-----------STRINGA
WTO >select rtrim('
RTRIM('STRIN
-----------STRINGA
La funzione TRIM elimina gli spazi sia dalla destra che dalla
sinistra di una stringa:
WTO >select trim('
STRINGA
TRIM('S
------STRINGA
231
LPAD ed RPAD
232
REPLACE
233
TRANSLATE
TRANSLATE(NOME,'AMR','*-+')
------------------------------*+CO
GIOV*NNI
-*TTEO
LUC*
*-B+OGIO
GENN*+O
P*SQU*LE
VINCENZO
Selezionate 8 righe.
ASCII e CHR
La funzione ASCII riceve in input un carattere e ne restituisce il
codice ASCII (
234
7.5.4
ABS
ROUND e TRUNC
235
236
CEIL e FLOOR
EXP, LN e LOG
237
POWER e SQRT
SIGN
La funzione segno SIGN riceve in input un numero e restituisce:
1 se il numero in input maggiore di zero,
0 se il numero in input zero,
-1 se il numero in input minore di zero.
238
MOD e REMAINDER
TRIGONOMETRICHE
239
7.5.5
SYSDATE e SYSTIMESTAMP
240
ADD_MONTHS
241
MONTHS_BETWEEN
242
LAST_DAY
NEXT_DAY
243
ROUND e TRUNC
La funzione ROUND arrotonda una data al giorno pi vicino.
244
CURRENT_DATE e CURRENT_TIMESTAMP
245
EXTRACT
246
247
7.5.6
Funzioni di conversione
TO_CHAR
248
TO_DATE
La funzione TO_DATE consente di convertire una stringa in
data.
WTO >select to_date('12-nov-10') from dual;
TO_DATE('
--------12-NOV-10
249
TO_NUMBER
TO_TIMESTAMP
250
7.5.7
251
252
253
254
7.5.8
255
7.5.9
NVL
Selezionate 8 righe.
WTO >select nvl(cod_fisc,'VALORE NON DISPONIBILE')
2 from clienti;
NVL(COD_FISC,'VALORENO
---------------------RSSMRC70R20H501X
VALORE NON DISPONIBILE
VRDMTT69S02H501X
NRILCU77A22F205X
VALORE NON DISPONIBILE
SPSGNN71B10F839X
RSSPSQ70C14F839X
VALORE NON DISPONIBILE
Selezionate 8 righe.
256
NVL2
257
COALESCE
258
B
---------B
B
@
@
@
C
---------C
C
C
@
@
D
---------D
D
D
D
@
259
LNNVL
COD_FISC
---------------RSSMRC70R20H501X
@
VRDMTT69S02H501X
NRILCU77A22F205X
@
SPSGNN71B10F839X
RSSPSQ70C14F839X
@
Selezionate 8 righe.
WTO >select nome from clienti
2 where cod_fisc like 'R%';
NOME
-------MARCO
PASQUALE
260
NULLIF
NULLIF(NOME,'MARCO')
-----------------------------@
GIOVANNI
MATTEO
LUCA
AMBROGIO
GENNARO
PASQUALE
VINCENZO
Selezionate 8 righe.
WTO >select cod_fisc, nullif(cod_fisc,NULL)
2 from clienti;
COD_FISC
---------------RSSMRC70R20H501X
@
VRDMTT69S02H501X
NRILCU77A22F205X
@
SPSGNN71B10F839X
RSSPSQ70C14F839X
@
NULLIF(COD_FISC,
---------------RSSMRC70R20H501X
@
VRDMTT69S02H501X
NRILCU77A22F205X
@
SPSGNN71B10F839X
RSSPSQ70C14F839X
@
Selezionate 8 righe.
261
REGEXP_INSTR
Dove
i (ricerca case-insensitive),
c (ricerca case-sensitive),
262
REGEXP_REPLACE
Dove
REGEXP_SUBSTR
Dove
263
REGEXP_COUNT
Dove
WITH T AS (
SELECT 'Questa una stringa di prova che mi consente
di illustrare le regex in Oracle' str from dual)
Select str,
REGEXP_COUNT(str,'(^|\ )[[:alpha:]]{2}($|\ )',1) count
FROM t;
STR
COUNT
-------------------------------------------------- ---------Questa una stringa di prova che mi consente
4
di illustrare le regex in Oracle
264
WITH T AS (
SELECT 'Questa una stringa di prova che mi consente
di illustrare le regex in Oracle' str from dual)
Select str,
trim(REGEXP_SUBSTR(str,'(^|\ )[[:alpha:]]{2}($|\ )',1, level)) substr
FROM t
connect by level<=REGEXP_COUNT(str,'(^|\ )[[:alpha:]]{2}($|\ )',1);
STR
SUBSTR
-------------------------------------------------- -----Questa una stringa di prova che mi consente
di
di illustrare le regex in Oracle
Questa una stringa di prova che mi consente
di illustrare le regex in Oracle
mi
di
le
in
REGEXP_LIKE
Dove
REGEXP_LIKE(str,ptrn,mp)
REGEXP_INSTR(str,ptrn,1,1,mp)>0
logicamente
equivalente
WITH T AS (
SELECT 'Stringa senza parole di2' str from dual union
SELECT 'prima Stringa con parole di 2 caratteri' from dual
union
SELECT 'seconda Stringa con parole di 2 caratteri' from dual
union
SELECT 'Altra Stringa senza parole di2' from dual
)
Select str
from t
where REGEXP_LIKE(str,'(^|\ )[[:alpha:]]{2}($|\ )');
STR
-------------------------------------------------prima Stringa con parole di 2 caratteri
seconda Stringa con parole di 2 caratteri
265
WTO>
2
3
4
5
6
7
8
9
10
11
WITH T AS (
SELECT 'Stringa senza parole di2' str from dual union
SELECT 'prima Stringa con parole di 2 caratteri' from dual
union
SELECT 'seconda Stringa con parole di 2 caratteri' from dual
union
SELECT 'Altra Stringa senza parole di2' from dual
)
Select str
from t
where REGEXP_INSTR(str,'(^|\ )[[:alpha:]]{2}($|\ )')>0;
STR
-------------------------------------------------prima Stringa con parole di 2 caratteri
seconda Stringa con parole di 2 caratteri
DECODE
266
DATA_FATT
--------01-OTT-10
01-DIC-10
20-OTT-10
01-FEB-11
01-DIC-10
pagata?
---------PAGATA
NON PAGATA
PAGATA
NON PAGATA
PAGATA
DATA_FATT
--------01-OTT-10
01-DIC-10
20-OTT-10
01-FEB-11
01-DIC-10
POSIZ
---------PRIMA
SECONDA
SUCCESSIVE
SUCCESSIVE
SUCCESSIVE
CF?
-----CON CF
NO CF
CON CF
CON CF
NO CF
CON CF
CON CF
NO CF
Selezionate 8 righe.
267
CASE
THEN <risultato1>
THEN <risultato2>
THEN <risultatoN>
default>
268
DATA_FATT
--------01-OTT-10
01-DIC-10
20-OTT-10
01-FEB-11
01-DIC-10
pagata?
---------PAGATA
NON PAGATA
PAGATA
NON PAGATA
PAGATA
DATA_FATT
--------01-OTT-10
01-DIC-10
20-OTT-10
01-FEB-11
01-DIC-10
POSIZ
---------PRIMA
SECONDA
SUCCESSIVE
SUCCESSIVE
SUCCESSIVE
CF?
-----CON CF
CON CF
CON CF
CON CF
CON CF
CON CF
CON CF
CON CF
Selezionate 8 righe.
WTO >select num_fattura, importo,
2 case sign(importo-500)
3 when 1 then '>500'
4 when 0 then '=500'
5 when -1 then '<500' end fascia
6 from fatture;
NUM_FATTURA
IMPORTO FASCIA
----------- ---------- -----1
300 <500
2
500 =500
3
700 >500
4
1000 >500
5
500 =500
269
CF?
-----CON CF
NO CF
CON CF
CON CF
NO CF
CON CF
CON CF
NO CF
Selezionate 8 righe.
GREATEST
270
LEAST
271
7.6
272
COGNOME
-------ROSSI
ROSSI
ROSSI
ROSSI
ROSSI
ROSSI
ROSSI
ROSSI
ROSSI
BIANCHI
BIANCHI
BIANCHI
BIANCHI
BIANCHI
BIANCHI
BIANCHI
BIANCHI
BIANCHI
VERDI
VERDI
VERDI
VERDI
VERDI
VERDI
VERDI
VERDI
VERDI
NERI
NERI
NERI
NERI
NERI
NERI
NERI
NERI
NERI
COLOMBO
COLOMBO
COLOMBO
COLOMBO
COLOMBO
COLOMBO
COLOMBO
COLOMBO
COLOMBO
ESPOSITO
ESPOSITO
INDIRIZZO
---------------------VIA LAURENTINA, 700
VIA LAURENTINA, 700
VIA LAURENTINA, 700
VIA LAURENTINA, 700
VIA LAURENTINA, 700
VIA LAURENTINA, 700
VIA LAURENTINA, 700
VIA LAURENTINA, 700
VIA LAURENTINA, 700
VIA OSTIENSE, 850
VIA OSTIENSE, 850
VIA OSTIENSE, 850
VIA OSTIENSE, 850
VIA OSTIENSE, 850
VIA OSTIENSE, 850
VIA OSTIENSE, 850
VIA OSTIENSE, 850
VIA OSTIENSE, 850
VIA DEL MARE, 8
VIA DEL MARE, 8
VIA DEL MARE, 8
VIA DEL MARE, 8
VIA DEL MARE, 8
VIA DEL MARE, 8
VIA DEL MARE, 8
VIA DEL MARE, 8
VIA DEL MARE, 8
VIA TORINO, 30
VIA TORINO, 30
VIA TORINO, 30
VIA TORINO, 30
VIA TORINO, 30
VIA TORINO, 30
VIA TORINO, 30
VIA TORINO, 30
VIA TORINO, 30
PIAZZA DUOMO, 1
PIAZZA DUOMO, 1
PIAZZA DUOMO, 1
PIAZZA DUOMO, 1
PIAZZA DUOMO, 1
PIAZZA DUOMO, 1
PIAZZA DUOMO, 1
PIAZZA DUOMO, 1
PIAZZA DUOMO, 1
VIA CARACCIOLO, 100
VIA CARACCIOLO, 100
COMU
---H501
H501
H501
H501
H501
H501
H501
H501
H501
H501
H501
H501
H501
H501
H501
H501
H501
H501
G811
G811
G811
G811
G811
G811
G811
G811
G811
F205
F205
F205
F205
F205
F205
F205
F205
F205
F205
F205
F205
F205
F205
F205
F205
F205
F205
F839
F839
COD_
---H501
G811
M297
F205
G686
E415
F839
G964
G902
H501
G811
M297
F205
G686
E415
F839
G964
G902
H501
G811
M297
F205
G686
E415
F839
G964
G902
H501
G811
M297
F205
G686
E415
F839
G964
G902
H501
G811
M297
F205
G686
E415
F839
G964
G902
H501
G811
DES_COMUNE
---------ROMA
POMEZIA
FIUMICINO
MILANO
PIOLTELLO
LAINATE
NAPOLI
POZZUOLI
PORTICI
ROMA
POMEZIA
FIUMICINO
MILANO
PIOLTELLO
LAINATE
NAPOLI
POZZUOLI
PORTICI
ROMA
POMEZIA
FIUMICINO
MILANO
PIOLTELLO
LAINATE
NAPOLI
POZZUOLI
PORTICI
ROMA
POMEZIA
FIUMICINO
MILANO
PIOLTELLO
LAINATE
NAPOLI
POZZUOLI
PORTICI
ROMA
POMEZIA
FIUMICINO
MILANO
PIOLTELLO
LAINATE
NAPOLI
POZZUOLI
PORTICI
ROMA
POMEZIA
PR
-RM
RM
RM
MI
MI
MI
NA
NA
NA
RM
RM
RM
MI
MI
MI
NA
NA
NA
RM
RM
RM
MI
MI
MI
NA
NA
NA
RM
RM
RM
MI
MI
MI
NA
NA
NA
RM
RM
RM
MI
MI
MI
NA
NA
NA
RM
RM
273
GENNARO
GENNARO
GENNARO
GENNARO
GENNARO
GENNARO
GENNARO
PASQUALE
PASQUALE
PASQUALE
PASQUALE
PASQUALE
PASQUALE
PASQUALE
PASQUALE
PASQUALE
VINCENZO
VINCENZO
VINCENZO
VINCENZO
VINCENZO
VINCENZO
VINCENZO
VINCENZO
VINCENZO
ESPOSITO
ESPOSITO
ESPOSITO
ESPOSITO
ESPOSITO
ESPOSITO
ESPOSITO
RUSSO
RUSSO
RUSSO
RUSSO
RUSSO
RUSSO
RUSSO
RUSSO
RUSSO
AMATO
AMATO
AMATO
AMATO
AMATO
AMATO
AMATO
AMATO
AMATO
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
VIA
CARACCIOLO, 100
CARACCIOLO, 100
CARACCIOLO, 100
CARACCIOLO, 100
CARACCIOLO, 100
CARACCIOLO, 100
CARACCIOLO, 100
GIULIO CESARE, 119
GIULIO CESARE, 119
GIULIO CESARE, 119
GIULIO CESARE, 119
GIULIO CESARE, 119
GIULIO CESARE, 119
GIULIO CESARE, 119
GIULIO CESARE, 119
GIULIO CESARE, 119
NAPOLI, 234
NAPOLI, 234
NAPOLI, 234
NAPOLI, 234
NAPOLI, 234
NAPOLI, 234
NAPOLI, 234
NAPOLI, 234
NAPOLI, 234
F839
F839
F839
F839
F839
F839
F839
F839
F839
F839
F839
F839
F839
F839
F839
F839
G964
G964
G964
G964
G964
G964
G964
G964
G964
M297
F205
G686
E415
F839
G964
G902
H501
G811
M297
F205
G686
E415
F839
G964
G902
H501
G811
M297
F205
G686
E415
F839
G964
G902
FIUMICINO
MILANO
PIOLTELLO
LAINATE
NAPOLI
POZZUOLI
PORTICI
ROMA
POMEZIA
FIUMICINO
MILANO
PIOLTELLO
LAINATE
NAPOLI
POZZUOLI
PORTICI
ROMA
POMEZIA
FIUMICINO
MILANO
PIOLTELLO
LAINATE
NAPOLI
POZZUOLI
PORTICI
RM
MI
MI
MI
NA
NA
NA
RM
RM
RM
MI
MI
MI
NA
NA
NA
RM
RM
RM
MI
MI
MI
NA
NA
NA
Selezionate 72 righe.
Inner join
274
COGNOME
-------NERI
COLOMBO
RUSSO
ESPOSITO
VERDI
AMATO
BIANCHI
ROSSI
INDIRIZZO
---------------------VIA TORINO, 30
PIAZZA DUOMO, 1
VIA GIULIO CESARE, 119
VIA CARACCIOLO, 100
VIA DEL MARE, 8
VIA NAPOLI, 234
VIA OSTIENSE, 850
VIA LAURENTINA, 700
COMU
---F205
F205
F839
F839
G811
G964
H501
H501
COD_
---F205
F205
F839
F839
G811
G964
H501
H501
DES_COMUNE
---------MILANO
MILANO
NAPOLI
NAPOLI
POMEZIA
POZZUOLI
ROMA
ROMA
PR
-MI
MI
NA
NA
RM
NA
RM
RM
Selezionate 8 righe.
COGNOME
-------NERI
COLOMBO
RUSSO
ESPOSITO
VERDI
AMATO
BIANCHI
ROSSI
INDIRIZZO
---------------------VIA TORINO, 30
PIAZZA DUOMO, 1
VIA GIULIO CESARE, 119
VIA CARACCIOLO, 100
VIA DEL MARE, 8
VIA NAPOLI, 234
VIA OSTIENSE, 850
VIA LAURENTINA, 700
COMU
---F205
F205
F839
F839
G811
G964
H501
H501
COD_
---F205
F205
F839
F839
G811
G964
H501
H501
DES_COMUNE
---------MILANO
MILANO
NAPOLI
NAPOLI
POMEZIA
POZZUOLI
ROMA
ROMA
PR
-MI
MI
NA
NA
RM
NA
RM
RM
Selezionate 8 righe.
275
COGNOME
-------ROSSI
VERDI
INDIRIZZO
---------------------VIA LAURENTINA, 700
VIA DEL MARE, 8
COMU
---H501
G811
COD_
---H501
G811
DES_COMUNE
---------ROMA
POMEZIA
PR
-RM
RM
276
7.6.4
Outer join
277
vogliamo tutti gli ordini anche quelli che non hanno fatture
corrispondenti. Quindi la colonna in cui vogliamo ignorare le mancanze
di corrispondenze F.NUM_ORDINE. La condizione di JOIN diventa
dunque
O.NUM_ORDINE=F.NUM_ORDINE(+)
278
Type
-----------NUMBER(4)
VARCHAR2(10)
VARCHAR2(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NUMBER(2)
Type
-----------NUMBER(2)
VARCHAR2(14)
VARCHAR2(13)
DNAME
-------------ACCOUNTING
RESEARCH
SALES
OPERATIONS
279
280
281
282
7.7
UNION
COGNOME
-----------------------------COLOMBO
BIANCHI
ROSSI
AMATO
COGNOME
-------------------ROSSI
BIANCHI
COLOMBO
AMATO
283
COGNOME
-----------------------------COLOMBO
BIANCHI
H501
H501
AMATO
284
COGNOME
--------------------COLOMBO
BIANCHI
H501
H501
AMATO
COGNOME
--------------------COLOMBO
BIANCHI
H501
H501
AMATO
285
ENAME
DEPTNO
DEPTNO DNAME
---------- ---------- ---------- -------------ADAMS
20
20 RESEARCH
ALLEN
30
30 SALES
BLAKE
30
30 SALES
CLARK
10
10 ACCOUNTING
FORD
JAMES
30
30 SALES
JONES
20
20 RESEARCH
KING
10
10 ACCOUNTING
MARTIN
30
30 SALES
MILLER
10
10 ACCOUNTING
SCOTT
20
20 RESEARCH
SMITH
20
20 RESEARCH
TURNER
30
30 SALES
WARD
30
30 SALES
40 OPERATIONS
15 rows selected.
UNION ALL
286
WTO>
2
3
4
5
6
7
ENAME
DEPTNO
DEPTNO DNAME
---------- ---------- ---------- -------------MILLER
10
10 ACCOUNTING
KING
10
10 ACCOUNTING
CLARK
10
10 ACCOUNTING
ADAMS
20
20 RESEARCH
SCOTT
20
20 RESEARCH
JONES
20
20 RESEARCH
SMITH
20
20 RESEARCH
JAMES
30
30 SALES
TURNER
30
30 SALES
BLAKE
30
30 SALES
MARTIN
30
30 SALES
WARD
30
30 SALES
ALLEN
30
30 SALES
FORD
40 OPERATIONS
15 rows selected.
INTERSECT
COGNOME
-------------------NERI
ROSSI
RUSSO
ESPOSITO
VERDI
COGNOME
-------------------ROSSI
BIANCHI
287
7.7.4
MINUS
COGNOME
-----------------NERI
ROSSI
RUSSO
ESPOSITO
VERDI
COGNOME
-----------------ROSSI
BIANCHI
WTO >select nome, cognome from clienti where cod_fisc is not null
2 minus
3 select nome, cognome from clienti where comune='H501';
NOME
-----------------------------GENNARO
LUCA
MATTEO
PASQUALE
COGNOME
-----------------ESPOSITO
NERI
VERDI
RUSSO
288
7.8
Ricerche innestate
289
Operatori di confronto
290
ANY
ALL
291
IN (subquery)
COGNOME
-------VERDI
BIANCHI
ROSSI
INDIRIZZO
---------------------VIA DEL MARE, 8
VIA OSTIENSE, 850
VIA LAURENTINA, 700
COGNOME
-------VERDI
BIANCHI
ROSSI
INDIRIZZO
---------------------VIA DEL MARE, 8
VIA OSTIENSE, 850
VIA LAURENTINA, 700
EXISTS
292
COGNOME
-------ROSSI
BIANCHI
NERI
COLOMBO
RUSSO
COGNOME
-------ROSSI
BIANCHI
NERI
COLOMBO
RUSSO
COGNOME
-------ROSSI
ROSSI
BIANCHI
NERI
COLOMBO
RUSSO
Selezionate 6 righe.
293
COGNOME
-------ROSSI
BIANCHI
NERI
COLOMBO
RUSSO
7.8.2
COGNOME
-------BIANCHI
NERI
ROSSI
COLOMBO
RUSSO
294
295
296
La clausola WITH
297
7.9
Comandi TCL
COMMIT
298
Tipo
-----------NUMBER
VARCHAR2(10)
299
B
---------ins wt1
ins wt1
7.9.3
ROLLBACK
B
---------ins wt1
ins wt1
ins wt1
ins wt1
B
---------ins wt1
ins wt1
300
7.9.4
SAVEPOINT
B
---------ins wt1
ins wt1
ins wt1
ins wt1
301
B
---------ins wt1
ins wt1
ins wt1
B
---------ins wt1
ins wt1
ins wt1
302
B
---------ins wt1
ins wt1
ins wt1
7.9.5
B
---------ins wt1
ins wt1
ins wt1
SET TRANSACTION
B
---------ins wt1
ins wt1
ins wt1
303
WT2 >commit;
Commit completato.
B
---------ins wt1
ins wt1
ins wt1
B
---------ins wt1
ins wt1
ins wt1
ins wt2
304
B
---------ins wt1
ins wt1
ins wt1
ins wt2
B
---------agg
ins wt1
ins wt1
ins wt2
suo
B
---------agg
ins wt1
ins wt1
ins wt2
WT2 >commit;
Commit completato.
305
B
---------agg
ins wt1
ins wt1
ins wt2
B
---------agg
agg2
ins wt1
ins wt2
B
---------agg
ins wt1
ins wt1
ins wt2
306
B
---------agg
ins wt1
ins wt1
ins wt2
307
WT1 >roll;
Completato rollback.
La sessione 2 va avanti.
WT2 >update test_tr
2 set b='agg3'
3 where a=3;
Aggiornata 1 riga.
WT2 >select * from test_tr;
A
---------10
2
3
4
B
---------agg
agg2
agg3
ins wt2
WT2 >commit;
Commit completato.
7.9.7
308
Facciamo un esempio.
La sessione 1 acquisisce un lock sulla riga numero tre della
tabella TEST_TR.
WT1 >update test_tr set b='x' where a=3;
Aggiornata 1 riga.
309
JOB
--------CLERK
SALESMAN
SALESMAN
MANAGER
SALESMAN
MANAGER
MANAGER
ANALYST
PRESIDENT
SALESMAN
CLERK
CLERK
ANALYST
CLERK
Selezionate 14 righe.
310
7.10.3 RUOLI
Pu essere utile accorpare in un unico contenitore un insieme di
privilegi in modo da poterli concedere o revocare tutti insieme. Un
contenitore di privilegi si chiama RUOLO.
311
312
8 PL/SQL
313
8.1
8.2
314
per
315
Ad esempio:
DECLARE
A VARCHAR2(3); --Commento che continua fino a fine linea
BEGIN
/*commento che continua anche
Sulle righe successive
A quella in cui iniziato*/
dbms_output.put_line('Hello World!');
END;
316
8.3
8.3.1
Tipi di dato
Dichiarazione di variabili
317
DECLARE
Variabile_stringa
Variabile_numero
Variabile_booleana
Variabile_data
BEGIN
VARCHAR2(100) := 'Esempio';
NUMBER(10,4) := 1234.9872;
BOOLEAN
:= TRUE;
DATE;
8.3.3
CLIENTI.COD_CLIENTE%TYPE;
Dichiarazione di costanti
318
8.4
Costrutti di base
Assegnazione di un valore.
319
320
321
WTO >declare
2
voto number := 6;
3
giudizio varchar2(20);
4 begin
5
giudizio := case voto
6
when 10 then 'Eccellente'
7
when 9 then 'Ottimo'
8
when 8 then 'Distinto'
9
when 7 then 'Buono'
10
when 6 then 'Sufficiente'
11
when 5 then 'Mediocre'
12
else 'Insufficiente'
13
end;
14
dbms_output.put_line('Giudizio:'||giudizio);
15 end;
16 /
Giudizio:Sufficiente
Procedura PL/SQL completata correttamente.
WTO >declare
2
voto number := 3;
3
giudizio varchar2(20);
4 begin
5
giudizio := case voto
6
when 10 then 'Eccellente'
7
when 9 then 'Ottimo'
8
when 8 then 'Distinto'
9
when 7 then 'Buono'
10
when 6 then 'Sufficiente'
11
when 5 then 'Mediocre'
12
else 'Insufficiente'
13
end;
14
dbms_output.put_line('Giudizio:'||giudizio);
15 end;
16 /
Giudizio:Insufficiente
Procedura PL/SQL completata correttamente.
8.4.3
Strutture Iterative
322
LOOP
<istruzioni1>
EXIT WHEN <condizione>
<istruzioni2>
END LOOP;
323
324
WTO >begin
2
for g in REVERSE 1..extract(day from systimestamp) loop
3
dbms_output.put_line('giorno '||g);
4
end loop;
5 end;
6 /
giorno 10
giorno 9
giorno 8
giorno 7
giorno 6
giorno 5
giorno 4
giorno 3
giorno 2
giorno 1
Procedura PL/SQL completata correttamente.
325
8.4.4
Strutture Sequenziali
326
327
8.5
Utilizzo dellSQL
SQL Statico
328
WTO >declare
2
num_f number;
3
max_f number;
4
avg_f number;
5 begin
6
select count(*), max(importo), avg(importo)
7
into num_f, max_f, avg_f
8
from fatture;
9
10
dbms_output.put_line('Ci sono '||num_f||' fatture.');
11
dbms_output.put_line('La pi alta di '||max_f||' euro');
12
dbms_output.put_line('La media di '||avg_f||' euro');
13
14 end;
15 /
Ci sono 5 fatture.
La pi alta di 1000 euro
La media di 600 euro
Procedura PL/SQL completata correttamente.
8.5.2
SQL Dinamico
Per tutte le istruzioni SQL che non rientrano tra quelle per cui si
pu utilizzare lSQL statico possibile costruire il comando SQL come
stringa e poi eseguirlo.
Lesecuzione dinamica di SQL si esegue grazie allistruzione
EXECUTE IMMEDIATE a cui si passa la stringa contenente il
comando da eseguire ed eventualmente altri parametri. Per introdurre
listruzione ad esempio si pu utilizzare il caso in cui un programma
PL/SQL deve creare una tabella.
Con unistruzione SQL statica ci vietato.
WTO >begin
2
create table abcd (a number);
3 end;
4 /
create table abcd (a number);
*
ERRORE alla riga 2:
ORA-06550: line 2, column 2:
PLS-00103: Encountered the symbol "CREATE" when expecting one of
the following:
begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe
329
WTO >declare
2
s varchar2(100):='create table abcd (a number)';
3 begin
4
execute immediate s;
5 end;
6 /
Procedura PL/SQL completata correttamente.
WTO >desc abcd
Nome
Nullo?
Tipo
-------------------------- -------- --------A
NUMBER
330
WTO >declare
2
num_r number;
3
s varchar2(100):=
4 'select count(*) from clienti where comune=:c';
5 begin
6
execute immediate s into num_r using 'H501';
7
dbms_output.put_line('Ho '||num_r||' clienti a ROMA.');
8
execute immediate s into num_r using 'F839';
9
dbms_output.put_line('Ho '||num_r||' clienti a NAPOLI.');
10 end;
11 /
Ho 2 clienti a ROMA.
Ho 2 clienti a NAPOLI.
Procedura PL/SQL completata correttamente.
331
WTO >declare
2
r number;
3
s_cli varchar2(100):= 'select count(*) from clienti';
4
s_fat varchar2(100):= 'select count(*) from fatture';
5 begin
6
if extract(day from systimestamp)>10 then
7
execute immediate s_cli into r;
8
else
9
execute immediate s_fat into r;
10
end if;
11
dbms_output.put_line('Ci sono '||r||' righe in tabella.');
12 end;
13 /
Ci sono 8 righe in tabella.
Procedura PL/SQL completata correttamente.
332
WTO >declare
2
r number;
3
s_cli varchar2(100):= 'select count(*) from clienti';
4
s_fat varchar2(100):= 'select count(*) from fatture';
5 begin
6
if extract(day from systimestamp)>10 then
7
execute immediate s_cli into r;
8
else
9
execute immediate s_fat into r;
10
end if;
11
dbms_output.put_line('Ci sono '||r||' righe in tabella.');
12 end;
13 /
Ci sono 8 righe in tabella.
Procedura PL/SQL completata correttamente.
CURSORI
Gli esempi di query SQL visti finora, sia nella modalit statica
che nella modalit dinamica, estraggono un singolo record dal
database. Nel caso in cui la query estragga un insieme di record la
clausola INTO genera un errore. Chiaramente spesso necessario
leggere molti record dal DB, per gestire questesigenza il PL/SQL
mette a disposizione i cursori. Un cursore non altro che un nome
simbolico assegnato ad una query. Il cursore si dichiara nella sezione
DECLARE e poi si utilizza (eseguendo effettivamente la query e
scorrendo le righe estratte) nella sezione delle istruzioni operative.
Lo scorrimento di un cursore richiede un LOOP, non essendo
noto a priori quanti record ci saranno nel cursore.
Nellesempio seguente viene dichiarato un cursore che estrae
nome, cognome e comune dei clienti, il cursore viene poi aperto (cio
viene eseguita la query), scorso ed infine chiuso. Solo i clienti residenti
a Napoli o Roma vengono stampati a video.
333
WTO >declare
2
v_nome clienti.nome%type;
3
v_cogn clienti.cognome%type;
4
v_com clienti.comune%type;
5
cursor c is
6
select nome, cognome, comune
7
from clienti;
8 begin
9
open c;
10
loop
11
fetch c into v_nome, v_cogn, v_com;
12
exit when c%notfound;
13
if v_com in ('H501','F839') then
14
dbms_output.put_line('Cliente '||v_nome||' '||v_cogn);
15
end if;
16
end loop;
17
close c;
18 end;
19 /
Cliente MARCO ROSSI
Cliente GIOVANNI BIANCHI
Cliente GENNARO ESPOSITO
Cliente PASQUALE RUSSO
Procedura PL/SQL completata correttamente.
334
WTO >declare
2
cursor c is select sysdate from dual;
3 begin
4
if 1>2 then
5
open c;
6
end if;
7
close c;
8 end;
9 /
declare
*
ERRORE alla riga 1:
ORA-01001: invalid cursor
ORA-06512: at line 7
335
WTO >declare
2
v_nome clienti.nome%type;
3
v_cogn clienti.cognome%type;
4
v_com clienti.comune%type;
5
cursor c is
6
select nome, cognome, comune
7
from clienti;
8 begin
9
open c;
10
loop
11
fetch c into v_nome, v_cogn, v_com;
12
exit when c%notfound;
13
dbms_output.put_line('Letta la riga '||c%rowcount);
14
if v_com in ('H501','F839') then
15
dbms_output.put_line('Cliente '||v_nome||' '||v_cogn);
16
end if;
17
end loop;
18
close c;
19 end;
20 /
Letta la riga 1
Cliente MARCO ROSSI
Letta la riga 2
Cliente GIOVANNI BIANCHI
Letta la riga 3
Letta la riga 4
Letta la riga 5
Letta la riga 6
Cliente GENNARO ESPOSITO
Letta la riga 7
Cliente PASQUALE RUSSO
Letta la riga 8
Procedura PL/SQL completata correttamente.
336
WTO >declare
2
cursor c is
3
select nome, cognome, comune
4
from clienti;
5 begin
6
for r in c loop
7
dbms_output.put_line('Letta la riga '||c%rowcount);
8
if r.comune in ('H501','F839') then
9
dbms_output.put_line('Cliente '||r.nome||' '||r.cognome);
10
end if;
11
end loop;
12 end;
13 /
Letta la riga 1
Cliente MARCO ROSSI
Letta la riga 2
Cliente GIOVANNI BIANCHI
Letta la riga 3
Letta la riga 4
Letta la riga 5
Letta la riga 6
Cliente GENNARO ESPOSITO
Letta la riga 7
Cliente PASQUALE RUSSO
Letta la riga 8
Procedura PL/SQL completata correttamente.
337
8.6
8.6.1
Blocco Exception
338
8.6.2
Eccezioni predefinite
339
INVALID_NUMBER
Si verifica nel caso in cui viene effettuata una conversione di
una stringa a numero e la stringa non contiene un numero valido.
Nellesempio seguente si cerca di convertire il codice fiscale dei
clienti in numero.
WTO >declare
2 a number;
3 begin
4
select to_number(cod_fisc)
5
into a
6
from clienti;
7 end;
8 /
declare
*
ERRORE alla riga 1:
ORA-01722: invalid number
ORA-06512: at line 4
WTO >declare
2 a number;
3 begin
4
select to_number(cod_fisc)
5
into a
6
from clienti;
7 exception
8
when invalid_number then
9
dbms_output.put_line('Numero non valido.');
10 end;
11 /
Numero non valido.
Procedura PL/SQL completata correttamente.
NO_DATA_FOUND
Si verifica quando una SELECT..INTO non estrae nessun
record.
340
WTO >declare
2 a number;
3 begin
4
select cod_cliente
5
into a
6
from clienti
7
where nome='ASTOLFO';
8 end;
9 /
declare
*
ERRORE alla riga 1:
ORA-01403: no data found
ORA-06512: at line 4
WTO >declare
2 a number;
3 begin
4
select cod_cliente
5
into a
6
from clienti
7
where nome='ASTOLFO';
8 exception
9
when no_data_found then
10
dbms_output.put_line('Cliente non trovato.');
11 end;
12 /
Cliente non trovato.
Procedura PL/SQL completata correttamente.
TOO_MANY_ROWS
Si verifica quando una SELECT..INTO estrae pi di un record.
WTO >declare
2 a number;
3 begin
4
select cod_cliente
5
into a
6
from clienti
7
where comune='H501';
8 end;
9 /
declare
*
ERRORE alla riga 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 4
341
WTO >declare
2 a number;
3 begin
4
select cod_cliente
5
into a
6
from clienti
7
where comune='H501';
8 exception
9
when too_many_rows then
10
dbms_output.put_line('Pi di un cliente estratto.');
11 end;
12 /
Pi di un cliente estratto.
Procedura PL/SQL completata correttamente.
VALUE_ERROR
Si verifica quando si mette in una variabile un valore non valido.
Nellesempio seguente si cerca di assegnare il numero 5000 ad una
variabile definita NUMBER(3).
WTO >declare
2 a number(3);
3 begin
4
a:= 5000;
5 end;
6 /
declare
*
ERRORE alla riga 1:
ORA-06502: PL/SQL: numeric or value error: number precision too
large
ORA-06512: at line 4
WTO >declare
2 a number(3);
3 begin
4
a:= 5000;
5 exception
6
when value_error then
7
dbms_output.put_line('Valore non valido.');
8 end;
9 /
Valore non valido.
Procedura PL/SQL completata correttamente.
ZERO_DIVIDE
Si verifica quando si cerca di effettuare una divisione per zero.
Alcuni esempi sono stati mostrati nel paragrafo precedente.
OTHERS
uneccezione generica che si utilizza con il significato
qualunque altro errore si verifichi. Nellesempio seguente il
programma
gestisce
gli
errori
NO_DATA_FOUND
e
342
8.6.3
SQLCODE e SQLERRM
343
WTO >declare
2 a number;
3 begin
4
select to_number(cod_fisc)
5
into a
6
from clienti
7
where cod_cliente=1;
8 exception
9
when no_data_found then
10
dbms_output.put_line('Cliente non trovato.');
11
when too_many_rows then
12
dbms_output.put_line('Pi di un cliente estratto.');
13
when others then
14
dbms_output.put_line('Errore generico.');
15
dbms_output.put_line(sqlerrm);
16 end;
17 /
Errore generico.
ORA-01722: invalid number
Procedura PL/SQL completata correttamente.
8.6.4
Sollevare uneccezione
344
WTO >begin
2 raise_application_error(-20123,'Errore utente.');
3 end;
4 /
begin
*
ERRORE alla riga 1:
ORA-20123: Errore utente.
ORA-06512: at line 2
8.6.5
Eccezioni utente
345
Eccezioni mute
346
Eccezioni in un ciclo
possibile
inserire
BEGIN..EXCEPTION..END.
nel
ciclo
un
nuovo
blocco
347
WTO >declare
2
a number(3,2);
3 begin
4
for i in 1..20 loop
5
Begin
6
dbms_output.put_line('I='||i);
7
a:=1/(i-7);
8
dbms_output.put_line('A='||a);
9
exception
10
when zero_divide then
11
dbms_output.put_line('Divisione per zero!');
12
end;
13
end loop;
14 end;
15 /
I=1
A=-,17
I=2
A=-,2
I=3
A=-,25
I=4
A=-,33
I=5
A=-,5
I=6
A=-1
I=7
Divisione per zero!
I=8
A=1
I=9
A=,5
I=10
A=,33
I=11
A=,25
I=12
A=,2
I=13
A=,17
I=14
A=,14
I=15
A=,13
I=16
A=,11
I=17
A=,1
I=18
A=,09
I=19
A=,08
I=20
A=,08
Procedura PL/SQL completata correttamente.
348
349
WTO >declare
2 a number;
3 begin
4
begin
5
select 1 into a
6
from dual where 1=2;
7
dbms_output.put_line('Dopo l''errore');
8
exception
9
when no_data_found then
10
dbms_output.put_line('Gestore interno');
11
raise;
12
end;
13
dbms_output.put_line('Siamo nel blocco esterno');
14 exception
15
when no_data_found then
16
dbms_output.put_line('Gestore esterno');
17 end;
18 /
Gestore interno
Gestore esterno
Procedura PL/SQL completata correttamente.
350
8.7
8.7.1
Record
351
WTO >declare
2
type t_numeri is record (
3
num_f number,
4
max_f number,
5
avg_f number);
6
r t_numeri;
7 begin
8
select count(*), max(importo), avg(importo)
9
into r
10
from fatture;
11
12
dbms_output.put_line('Ci sono '||r.num_f||' fatture.');
13 dbms_output.put_line('La pi alta di '||r.max_f||' euro');
14
dbms_output.put_line('La media di '||r.avg_f||' euro');
15
16 end;
17 /
Ci sono 5 fatture.
La pi alta di 1000 euro
La media di 600 euro
Procedura PL/SQL completata correttamente.
352
353
8.7.2
354
355
Il cliente 1 MARCO
il suo cf RSSMRC70R20H501X
---------------------------------Il cliente 2 GIOVANNI
il suo cf
---------------------------------Il cliente 3 MATTEO
il suo cf VRDMTT69S02H501X
---------------------------------Il cliente 4 LUCA
il suo cf NRILCU77A22F205X
---------------------------------Il cliente 5 AMBROGIO
il suo cf
---------------------------------Il cliente 6 GENNARO
il suo cf SPSGNN71B10F839X
---------------------------------Il cliente 7 PASQUALE
il suo cf RSSPSQ70C14F839X
---------------------------------Il cliente 8 VINCENZO
il suo cf
---------------------------------Procedura PL/SQL completata correttamente.
356
ANNO
2000
2001
2002
2003
2004
Roma
13.000
11.300
12.500
14.400
16.000
Napoli
5.400
6.500
6.200
5.800
6.100
Milano
11.300
13.100
12.600
15.700
14.700
Firenze
2.350
2.680
2.200
2.920
2.810
Bologna
1.350
1.470
1.840
1.930
1.150
CITTA
357
8.7.3
Varray
358
Nested Table
359
Bulk collect
360
Il cliente 1 MARCO
il suo cf RSSMRC70R20H501X
---------------------------------Il cliente 2 GIOVANNI
il suo cf
---------------------------------Il cliente 3 MATTEO
il suo cf VRDMTT69S02H501X
---------------------------------Il cliente 4 LUCA
il suo cf NRILCU77A22F205X
---------------------------------Il cliente 5 AMBROGIO
il suo cf
---------------------------------Il cliente 6 GENNARO
il suo cf SPSGNN71B10F839X
---------------------------------Il cliente 7 PASQUALE
il suo cf RSSPSQ70C14F839X
---------------------------------Il cliente 8 VINCENZO
il suo cf
---------------------------------Procedura PL/SQL completata correttamente.
361
WTO >declare
2
type t_citta is table of varchar2(30);
3
c t_citta := t_citta('ROMA','NAPOLI','MILANO', 'FIRENZE');
4 begin
5
for i in c.first..c.last loop
6
dbms_output.put_line('Citt '||i||': '||c(i));
7
end loop;
8
dbms_output.put_line('Elimino il terzo elemento');
9
c.delete(3);
10
for i in c.first..c.last loop
11
dbms_output.put_line('Citt '||i||': '||c(i));
12
end loop;
13 end;
14 /
Citt 1: ROMA
Citt 2: NAPOLI
Citt 3: MILANO
Citt 4: FIRENZE
Elimino il terzo elemento
Citt 1: ROMA
Citt 2: NAPOLI
declare
*
ERRORE alla riga 1:
ORA-01403: no data found
ORA-06512: at line 11
362
Citt 1: ROMA
Citt 2: NAPOLI
Citt 3: MILANO
Citt 4: FIRENZE
Elimino il terzo elemento
Citt 1: ROMA
Citt 2: NAPOLI
Citt 4: FIRENZE
Procedura PL/SQL completata correttamente.
363
TRIM
Riceve in input un numero intero ed elimina dalla coda della
collection un numero di elementi pari al numero ricevuto in input.
WTO >declare
2
type t_citta is table of varchar2(30);
3
c t_citta := t_citta('ROMA','NAPOLI','MILANO', 'FIRENZE');
4
i number;
5 begin
6
i := c.first;
7
loop
8
dbms_output.put_line('Citt '||i||': '||c(i));
9
exit when i = c.last;
10
i := c.next(i);
11
end loop;
12
dbms_output.put_line('Elimino gli ultimi due elementi.');
13
c.trim(2);
14
i := c.first;
15
loop
16
dbms_output.put_line('Citt '||i||': '||c(i));
17
exit when i = c.last;
18
i := c.next(i);
19
end loop;
20 end;
21 /
Citt 1: ROMA
Citt 2: NAPOLI
Citt 3: MILANO
Citt 4: FIRENZE
Elimino gli ultimi due elementi.
Citt 1: ROMA
Citt 2: NAPOLI
Procedura PL/SQL completata correttamente.
364
EXTEND
Il metodo EXTEND aggiunge un elemento in coda alla
collection.
WTO >declare
2
type t_citta is table of varchar2(30);
3
c t_citta := t_citta('ROMA','NAPOLI','MILANO', 'FIRENZE');
4
i number;
5 begin
6
i := c.first;
7
loop
8
dbms_output.put_line('Citt '||i||': '||c(i));
9
exit when i = c.last;
10
i := c.next(i);
11
end loop;
12
dbms_output.put_line('Aggiungo un elemento vuoto');
13
c.extend;
14
i := c.first;
15
loop
16
dbms_output.put_line('Citt '||i||': '||c(i));
17
exit when i = c.last;
18
i := c.next(i);
19
end loop;
20 end;
21 /
Citt 1: ROMA
Citt 2: NAPOLI
Citt 3: MILANO
Citt 4: FIRENZE
Aggiungo un elemento vuoto
Citt 1: ROMA
Citt 2: NAPOLI
Citt 3: MILANO
Citt 4: FIRENZE
Citt 5:
Procedura PL/SQL completata correttamente.
365
WTO >declare
2
type t_citta is table of varchar2(30);
3
c t_citta := t_citta('ROMA','NAPOLI','MILANO', 'FIRENZE');
4
i number;
5 begin
6
i := c.first;
7
loop
8
dbms_output.put_line('Citt '||i||': '||c(i));
9
exit when i = c.last;
10
i := c.next(i);
11
end loop;
12
dbms_output.put_line('Aggiungo tre elementi vuoti.');
13
c.extend(3);
14
i := c.first;
15
loop
16
dbms_output.put_line('Citt '||i||': '||c(i));
17
exit when i = c.last;
18
i := c.next(i);
19
end loop;
20 end;
21 /
Citt 1: ROMA
Citt 2: NAPOLI
Citt 3: MILANO
Citt 4: FIRENZE
Aggiungo tre elementi vuoti.
Citt 1: ROMA
Citt 2: NAPOLI
Citt 3: MILANO
Citt 4: FIRENZE
Citt 5:
Citt 6:
Citt 7:
Procedura PL/SQL completata correttamente.
366
EXISTS
Ritorna TRUE o FALSE in funzione del fatto che un elemento
con un determinato indice esiste o meno nella collezione.
WTO >declare
2
type t_citta is table of varchar2(30);
3
c t_citta := t_citta('ROMA','NAPOLI','MILANO', 'FIRENZE');
4
i number;
5 begin
6
i := c.first;
7
loop
8
dbms_output.put_line('Citt '||i||': '||c(i));
9
exit when i = c.last;
10
i := c.next(i);
11
end loop;
12
dbms_output.put_line('Esiste l''elemento 3?');
13
if c.exists(3) then
14
dbms_output.put_line('S, esiste.');
15
else
16
dbms_output.put_line('No, non esiste.');
17
end if;
18 dbms_output.put_line('Esiste l''elemento 5?');
19
if c.exists(5) then
20
dbms_output.put_line('S, esiste.');
21
else
22
dbms_output.put_line('No, non esiste.');
23
end if;
24 end;
25 /
Citt 1: ROMA
Citt 2: NAPOLI
Citt 3: MILANO
Citt 4: FIRENZE
Esiste l'elemento 3?
S, esiste.
Esiste l'elemento 5?
No, non esiste.
Procedura PL/SQL completata correttamente.
367
FIRST
Il metodo FIRST ritorna il primo indice della collezione.
WTO >declare
2
type t_citta is table of varchar2(30);
3
c t_citta := t_citta('ROMA','NAPOLI','MILANO', 'FIRENZE');
4
i number;
5 begin
6
i := c.first;
7
loop
8
dbms_output.put_line('Citt '||i||': '||c(i));
9
exit when i = c.last;
10
i := c.next(i);
11
end loop;
12
dbms_output.put_line('Primo indice='||c.first);
13 end;
14 /
Citt 1: ROMA
Citt 2: NAPOLI
Citt 3: MILANO
Citt 4: FIRENZE
Primo indice=1
Procedura PL/SQL completata correttamente.
LAST
Il metodo LAST ritorna lultimo indice della collezione.
WTO >declare
2
type t_citta is table of varchar2(30);
3
c t_citta := t_citta('ROMA','NAPOLI','MILANO', 'FIRENZE');
4
i number;
5 begin
6
i := c.first;
7
loop
8
dbms_output.put_line('Citt '||i||': '||c(i));
9
exit when i = c.last;
10
i := c.next(i);
11
end loop;
12
dbms_output.put_line('Ultimo indice='||c.last);
13 end;
14 /
Citt 1: ROMA
Citt 2: NAPOLI
Citt 3: MILANO
Citt 4: FIRENZE
Ultimo indice=4
Procedura PL/SQL completata correttamente.
368
COUNT
Il metodo COUNT ritorna il numero totale di elementi presenti
nella collezione.
WTO >declare
2
type t_citta is table of varchar2(30);
3
c t_citta := t_citta('ROMA','NAPOLI','MILANO', 'FIRENZE');
4
i number;
5 begin
6
i := c.first;
7
loop
8
dbms_output.put_line('Citt '||i||': '||c(i));
9
exit when i = c.last;
10
i := c.next(i);
11
end loop;
12
dbms_output.put_line('Numero di elementi='||c.count);
13 end;
14 /
Citt 1: ROMA
Citt 2: NAPOLI
Citt 3: MILANO
Citt 4: FIRENZE
Numero di elementi=4
Procedura PL/SQL completata correttamente.
LIMIT
Il metodo LIMIT restituisce il numero massimo di elementi che la
collezione pu contenere. Restituisce NULL se la collezione non ha un
numero massimo di elementi.
In un array associativo ed in una nested table sar sempre
NULL.
WTO >declare
2
type t_citta is table of varchar2(30);
3
c t_citta := t_citta('ROMA','NAPOLI','MILANO', 'FIRENZE');
4
i number;
5 begin
6
i := c.first;
7
loop
8
dbms_output.put_line('Citt '||i||': '||c(i));
9
exit when i = c.last;
10
i := c.next(i);
11
end loop;
12
dbms_output.put_line('Numero massimo di
elementi='||c.limit);
13 end;
14 /
Citt 1: ROMA
Citt 2: NAPOLI
Citt 3: MILANO
Citt 4: FIRENZE
Numero massimo di elementi=
Procedura PL/SQL completata correttamente.
369
PRIOR
Il metodo PRIOR restituisce lindice precedente rispetto a quello
che riceve in input.
WTO >declare
2
type t_citta is table of varchar2(30);
3
c t_citta := t_citta('ROMA','NAPOLI','MILANO', 'FIRENZE');
4
i number;
5 begin
6
i := c.first;
7
loop
8
dbms_output.put_line('Citt '||i||': '||c(i));
9
exit when i = c.last;
10
i := c.next(i);
11
end loop;
12
dbms_output.put_line('Precedente di 3='||c.prior(3));
13
c.delete(2);
14
dbms_output.put_line('Precedente di 3='||c.prior(3));
15 end;
16 /
Citt 1: ROMA
Citt 2: NAPOLI
Citt 3: MILANO
Citt 4: FIRENZE
Precedente di 3=2
Precedente di 3=1
Procedura PL/SQL completata correttamente.
370
NEXT
Il metodo NEXT restituisce lindice successivo rispetto a quello
ricevuto in input.
WTO >declare
2
type t_citta is table of varchar2(30);
3
c t_citta := t_citta('ROMA','NAPOLI','MILANO', 'FIRENZE');
4
i number;
5 begin
6
i := c.first;
7
loop
8
dbms_output.put_line('Citt '||i||': '||c(i));
9
exit when i = c.last;
10
i := c.next(i);
11
end loop;
12
dbms_output.put_line('Successivo di 2='||c.next(2));
13 end;
14 /
Citt 1: ROMA
Citt 2: NAPOLI
Citt 3: MILANO
Citt 4: FIRENZE
Successivo di 2=3
Procedura PL/SQL completata correttamente.
371
8.8
Procedure
372
373
ERROR
--------------------------------------------------PL/SQL: SQL Statement ignored
PL/SQL: ORA-00942: table or view does not exist
Il log degli errori letto dal basso verso lalto mostra che a linea 3
della procedura stato utilizzata una tabella di database inesistente e
per questo motivo lintera istruzione a linea 3 stata ignorata.
Corretto lerrore creiamo nuovamente la procedura e cerchiamo
di eseguirla.
WTO >create or replace procedure aumenta is
2 begin
3
update fatture
4
set importo = importo*1.1;
5 end;
6 /
Procedura creata.
374
375
Annullo le modifiche.
WTO >rollback;
Rollback completato.
WTO >select * from fatture;
NUM_FATTURA NUM_ORDINE DATA_FATT
IMPORTO P
----------- ---------- --------- ---------- 1
1 01-OTT-10
300 S
2
1 01-DIC-10
500 N
3
2 20-OTT-10
700 S
4
3 01-FEB-11
1000 N
5
5 01-DIC-10
500 S
376
377
378
379
8.8.2
Funzioni
380
381
382
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Funzione creata.
WTO >select test_func(200), test_func(15)
2 from dual;
TEST_FUNC(200) TEST_FUNC(15)
-------------- ------------200
150
Errore di valore.
383
Errore di valore.
384
Errore di valore.
385
8.8.3
Package
386
387
Per il body
CREATE OR REPLACE PACKAGE BODY <nome package> IS
<dichiarazione delle variabili private di package>
PROCEDURE/FUNCTION <nome procedura o funzione >
<parametri> <eventuale clausola return> IS
<variabili di procedura o funzione>
BEGIN
<corpo della procedura o funzione>
END;
PROCEDURE/FUNCTION <nome procedura o funzione >
<parametri> <eventuale clausola return> IS
<variabili di procedura o funzione>
BEGIN
<corpo della procedura o funzione>
END;
PROCEDURE/FUNCTION <nome procedura o funzione >
<parametri> <eventuale clausola return> IS
<variabili di procedura o funzione>
BEGIN
<corpo della procedura o funzione>
END;
END;
388
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
389
390
391
ERROR
-------------------------------------------------------PL/SQL: Statement ignored
PLS-00313: 'TEST_FUNC' not declared in this scope
392
393
394
395
8.8.4
Database Trigger
396
397
398
399
400
401
DISABILITAZIONE ED ABILITAZIONE
Un trigger non pu essere eseguito esplicitamente, va in
esecuzione solo quando si verifica levento a cui collegato. per
possibile disabilitare un trigger per evitare che scatti. La disabilitazione
di un trigger si esegue con il comando
WTO >alter trigger TEST_UPD_CLI disable;
Trigger modificato.
DIMENSIONE DI UN TRIGGER
La massima dimensione del codice di un trigger 32Kb,
vivamente consigliato, per, non superare le sessanta linee di codice.
Se il codice supera le sessanta linee di codice consigliabile mettere
402
una parte del codice in una stored procedure oppure in una funzione di
database.
ORDINE DI ESECUZIONE
Su una tabella possono essere definiti pi trigger. In questo
caso lordine di esecuzione il seguente:
Before statement
After statement
403
UTILIZZI FREQUENTI
Gli utilizzi pi frequenti dei database trigger sono:
404
NOME
-------MARCO
GIOVANNI
MATTEO
LUCA
AMBROGIO
GENNARO
PASQUALE
VINCENZO
Luca
COGNOME
-------ROSSI
BIANCHI
VERDI
NERI
COLOMBO
ESPOSITO
RUSSO
AMATO
Bianchi
COD_FISC
INDIRIZZO
---------------- ---------------------RSSMRC70R20H501X VIA LAURENTINA, 700
VIA OSTIENSE, 850
VRDMTT69S02H501X VIA DEL MARE, 8
NRILCU77A22F205X VIA TORINO, 30
PIAZZA DUOMO, 1
SPSGNN71B10F839X VIA CARACCIOLO, 100
RSSPSQ70C14F839X VIA GIULIO CESARE, 119
VIA NAPOLI, 234
Via Po, 1
CAP
----00143
00144
00033
20120
20100
80100
80125
80022
00123
COMU
---H501
H501
G811
F205
F205
F839
F839
G964
H501
Selezionate 9 righe.
WTO >rollback;
Rollback completato.
405
406
407
MUTATING TABLE
Un trigger FOR EACH ROW scatta durante lesecuzione di un
comando DML. Durante il trigger, dunque, la tabella in fase di
cambiamento (mutating in inglese) e non pu essere letta o modificata.
Facciamo un esempio. Aggiungiamo al trigger dellesempio
precedente una banale query che conta il numero di record presenti in
CLIENTI.
WTO >create or replace trigger clienti_a_iud
2 after insert or update or delete on clienti
3 for each row
4 declare
5
evento varchar2(20);
6
n number;
7 begin
8
if inserting then
9
evento := 'Inserimento';
10
elsif updating then
11
evento := 'Aggiornamento';
12
else
13
evento := 'Cancellazione';
14
end if;
15
16
insert into log_clienti values
17
(sysdate, nvl(:old.cod_cliente,:new.cod_cliente),evento);
18
19
select count(*) into n
20
from clienti;
21 end;
22 /
Trigger creato.
408
409
COGNOME
-------NERI
COLOMBO
RUSSO
ESPOSITO
VERDI
AMATO
BIANCHI
ROSSI
DES_COMUNE
------------------------------------MILANO
MILANO
NAPOLI
NAPOLI
POMEZIA
POZZUOLI
ROMA
ROMA
Selezionate 8 righe.
410
fatto qualunque cosa nel DB, in questo caso non ha fatto nullaltro che
visualizzare il messaggio Tentato inserimento in CLI_COM.
8.8.5
Gli oggetti sul DB non sono tutti indipendenti tra loro. Giusto per
fare un esempio una vista dipendente dalle tabelle e viste su cui
eseguita la query. Se tali tabelle e viste cambiano, listruzione SQL che
definisce la vista potrebbe non essere pi sintatticamente corretta. Allo
stesso modo una procedura o funzione PL/SQL dipendente dagli
oggetti di database che utilizza e dagli altri programmi PL/SQL che
chiama.
Man mano che gli utenti creano o modificano oggetti nel
database, Oracle costruisce un grafo delle dipendenze in modo da
poter velocemente determinare, dato un oggetto, quali sono gli oggetti
che da esso dipendono. Quando un oggetto viene modificato,
qualunque sia la modifica, oppure eliminato Oracle marca come non
validi tutti gli oggetti di database da esso dipendenti. Oracle non
verifica immediatamente se gli oggetti dipendenti sono diventati
effettivamente inutilizzabili, li marca tutti come non validi a priori.
Quando un oggetto viene utilizzato, se marcato non valido, Oracle
verifica se effettivamente pu essere nuovamente validato oppure no.
Questattivit ovviamente richiede un certo tempo di elaborazione che
appesantisce listruzione SQL che lha generata.
Le dipendenze tra oggetti sono conservate nella vista di
dizionario USER_DEPENDENCIES. La vista contiene una riga per
ogni dipendenza.
411
TYPE
-----------TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
PACKAGE
TRIGGER
PACKAGE BODY
TABLE
TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
PACKAGE BODY
TRIGGER
TRIGGER
TRIGGER
TRIGGER
VIEW
VIEW
TRIGGER
VIEW
VIEW
TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
TRIGGER
PACKAGE BODY
TRIGGER
PACKAGE BODY
PACKAGE BODY
REFERENCED_NAME
--------------DUAL
STANDARD
STANDARD
STANDARD
STANDARD
STANDARD
STANDARD
STANDARD
STANDARD
STANDARD
STANDARD
DBMS_STANDARD
DBMS_OUTPUT
DBMS_OUTPUT
DBMS_OUTPUT
DBMS_OUTPUT
DBMS_OUTPUT
DBMS_OUTPUT
COMUNI
COMUNI
COMUNI
COMUNI
COMUNI
COMUNI
COMUNI
CLIENTI
CLIENTI
CLIENTI
CLIENTI
SEQ_CLIENTI
DBMS_OUTPUT
DBMS_OUTPUT
DBMS_OUTPUT
DBMS_OUTPUT
DBMS_OUTPUT
DBMS_OUTPUT
CLI_COM
TEST_PKG
FATTURE
REFERENCED_TYPE
--------------SYNONYM
PACKAGE
PACKAGE
PACKAGE
PACKAGE
PACKAGE
PACKAGE
PACKAGE
PACKAGE
PACKAGE
PACKAGE
PACKAGE
SYNONYM
SYNONYM
SYNONYM
SYNONYM
SYNONYM
SYNONYM
TABLE
TABLE
TABLE
TABLE
TABLE
TABLE
TABLE
TABLE
TABLE
TABLE
TABLE
SEQUENCE
NON-EXISTENT
NON-EXISTENT
NON-EXISTENT
NON-EXISTENT
NON-EXISTENT
NON-EXISTENT
VIEW
PACKAGE
TABLE
412
TYPE
-----------PROCEDURE
PROCEDURE
FUNCTION
PROCEDURE
PROCEDURE
FUNCTION
FUNCTION
PROCEDURE
PROCEDURE
REFERENCED_NAME
---------------------------STANDARD
STANDARD
STANDARD
SYS_STUB_FOR_PURITY_ANALYSIS
SYS_STUB_FOR_PURITY_ANALYSIS
SYS_STUB_FOR_PURITY_ANALYSIS
P2
F1
CLIENTI
REFERENCED_TYPE
--------------PACKAGE
PACKAGE
PACKAGE
PACKAGE
PACKAGE
PACKAGE
PROCEDURE
FUNCTION
TABLE
9 rows selected.
413
REFERENCED_TYPE
--------------PACKAGE
PACKAGE
FUNCTION
PACKAGE
PACKAGE
PROCEDURE
PACKAGE
PACKAGE
TABLE
9 rows selected.
414
REFERENCED_TYPE
--------------PACKAGE
PACKAGE
FUNCTION
PACKAGE
PACKAGE
PROCEDURE
PACKAGE
PACKAGE
TABLE
9 rows selected.
8.8.6
REFERENCED_TYPE
--------------FUNCTION
PROCEDURE
PACKAGE
PACKAGE
TABLE
Diritti desecuzione
415
WTO >commit;
Commit complete.
416
417
TYPE
LINE TEXT
------------ ----- ----------------------------FUNCTION
1 function leggi return number
FUNCTION
2 authid current_user is
FUNCTION
3 a number;
FUNCTION
4 begin
FUNCTION
5
select a into a from test;
FUNCTION
6
return a;
FUNCTION
7 end;
7 rows selected.
WTO >select text
2 from user_source
3 where name='LEGGI'
4 order by line;
TEXT
------------------------------function leggi return number
authid current_user is
a number;
begin
select a into a from test;
return a;
end;
7 rows selected.
418
Type
---VARCHAR2(30)
VARCHAR2(16)
VARCHAR2(227)
VARCHAR2(30)
VARCHAR2(16)
VARCHAR2(30)
VARCHAR2(4000)
VARCHAR2(128)
VARCHAR2(4000)
VARCHAR2(8)
VARCHAR2(4000)
VARCHAR2(11)
LONG
419
420
421
8.9
422
423
Prova del nove: cancello il file dal file system e scrivo una
procedura per tirarlo fuori dal DB.
create or replace procedure extract_blob(in_id in number) is
myblob BLOB;
lun_file BINARY_INTEGER;
myname myfiles.name%type;
myfile utl_file.file_type;
appo_raw RAW(32760);
buffer_length number := 32760;
wrote_length number := 0;
begin
select content, name, dbms_lob.getlength(content)
into myblob, myname, lun_file
from myfiles
where id=in_id;
myfile := utl_file.fopen('FILE_DIR', myname,'wb', 32760);
while lun_file>wrote_length loop
dbms_lob.read(myblob,buffer_length,wrote_length+1,appo_raw);
utl_file.put_raw(myfile,appo_raw);
utl_file.fflush(myfile);
wrote_length := wrote_length + buffer_length;
end loop;
utl_file.fclose(myfile);
end;
/
424
Crittografia in PL/SQL
425
426
Algoritmo da utilizzare
427
Chiave di cifratura
CIFRATO
---------------------------------------812DAC49DBEBD0619CEC10E4341FDA9DCC435007
1EB29B3B0F62AA8D95B1AA5996BA75ABB1E4AB91
FEA914480892D248A5D92E5642559135CD15DD50
6D878D5E6B17355800729310C0675B33B7546C12
428
429
5249464632B9DF154156
49204C4953547E220000
6864726C617669683800
0000409C000000000000
000000001001000072ED
00000000000002000000
00000000700200006001
00000000000000000000
430
DBMS_CRYPTO.Encrypt(blob_cifrato,blob_da_cifrare,alg,raw_chiave);
return out_id;
end;
/
431
5249464632B9DF154156
49204C4953547E220000
6864726C617669683800
0000409C000000000000
000000001001000072ED
00000000000002000000
00000000700200006001
00000000000000000000
3 WithOrWithoutYou.mp3 9243E49958296FFC341B
- cifrato
1120021A70A6006A285A
CE89D6F62EA04187E59B
6523DC6336B9FDDDC820
37DDCF8FDCA6FF1E0681
507A44F117F94F2DE517
8298B6F39FE6FA710003
8BE3C3F80F43AABF0200
432
DBMS_CRYPTO.Decrypt(blob_decifrato,blob_da_decifrare,alg,raw_chia
ve);
return out_id;
end;
/
433
5249464632B9DF154156
49204C4953547E220000
6864726C617669683800
0000409C000000000000
000000001001000072ED
00000000000002000000
00000000700200006001
00000000000000000000
3 WithOrWithoutYou.mp3 9243E49958296FFC341B
- cifrato
1120021A70A6006A285A
CE89D6F62EA04187E59B
6523DC6336B9FDDDC820
37DDCF8FDCA6FF1E0681
507A44F117F94F2DE517
8298B6F39FE6FA710003
8BE3C3F80F43AABF0200
4 WithOrWithoutYou.mp3 49443303000000000F76
- cifrato - decifra 47454F42000006A60000
to
0062696E617279000052
65616C4A756B65626F78
3A4D6574616461746100
524A4D44000000010000
06800000000000000000
0000001D000000220000
434
delle
utl_smtp.helo(mail_conn, mailhost);
435
436
BEGIN
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
acl
=> 'SMTP_ACL.xml',
description => 'ACL for SMTP',
principal
=> 'WTO_ESEMPIO',
is_grant
=> TRUE,
privilege
=> 'connect',
start_date
=> null,
end_date
=> null);
END;
/
BEGIN
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (
acl
=> 'SMTP_ACL.xml',
host
=> 'localhost',
lower_port => 25,
upper_port => 25);
END;
/
Il package DBMS_METADATA.
437
438
439
sono
le
funzioni
GET_XML
440
WTO>select dbms_metadata.get_dependent_xml('OBJECT_GRANT','EMP')
2 from dual;
DBMS_METADATA.GET_DEPENDENT_XML('OBJECT_GRANT','EMP')
--------------------------------------------------------------<?xml version="1.0"?><ROWSET><ROW>
<OBJGRANT_T>
<VERS_MAJOR>1</VERS_MAJOR>
<VERS_MINOR>2 </VERS_MINOR>
<OBJ_NUM>69585</OBJ_NUM>
<BASE_OBJ>
<OBJ_NUM>69585</OBJ_NUM>
<DATAOBJ_NUM>69585</DATAOBJ_NUM>
<OWNER_NUM>81</OWNER_NUM>
<OWNER_NAME>SCOTT</OWNER_NAME>
<NAME>EMP</NAME>
<NAMESPACE>1</NAMESPACE>
<TYPE_NUM>2</TYPE_NUM>
<TYPE_NAME>TABLE</TYPE_NAME>
<CTIME>2009-11-01 00:54:56</CTIME>
<MTIME>2009-12-26 00:29:16</MTIME>
<STIME>2009-11-01 00:54:56</STIME>
<STATUS>1</STATUS>
<FLAGS>0</FLAGS>
<SPARE1>6</SPARE1>
<SPARE2>1</SPARE2>
<SPARE3>81</SPARE3>
</BASE_OBJ>
<GRANTOR>SCOTT</GRANTOR>
<GRANTEE>SYSTEM</GRANTEE>
<PRIVNAME>SELECT</PRIVNAME>
<SEQUENCE>33681</SEQUENCE>
<WGO>0</WGO>
</OBJGRANT_T>
</ROW></ROWSET>
441
Oracle Scheduler.
Per definire finestre temporali in cui far girare i job nel caso in
cui ci serva assegnare particolari risorse di sistema alle sessioni
coinvolte.
gestione eventi
Per definire e gestire gli eventi scatenanti dei job (ad esempio la
ricezione di un file nel sistema)
442
gestione credenziali
Funzioni di servizio
443
Soffermiamoci
un
momento
sulla
definizione
della
schedulazione. stata utilizzata la frequenza, che pu valere
YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, e
SECONDLY e che pu essere rettificata mediante il parametro
numerico INTERVAL se vogliamo che il job giri ogni N secondi (o
minuti, ore, giorni...).
possibile anche indicare i secondi, i minuti, le ore, i giorni della
settimana o del mese, le settimane del mese o dell'anno, gli anni o le
date specifiche in cui si vuole far lavorare il job.
Ci si pu sbizzarrire per trovare la combinazione pi consona
alle proprie esigenze.
Altre modalit di creazione di un job:
444
445
Compilazione condizionale
Function created.
--Eseguo la funzione su un DB Oracle 10
WTO> select p from dual;
P
-------------------------------------------------------------oracle 10 (10)
446
select text
from user_source
where name='P'
order by line;
TEXT
----------------------------------------------------------------function p return varchar2 is
BEGIN
$IF DBMS_DB_VERSION.VERSION < 11 $THEN
return 'oracle 10 ('||DBMS_DB_VERSION.VERSION||')';
$ELSE
return 'da 11 in poi ('||DBMS_DB_VERSION.VERSION||')';
$END
END p;
8 rows selected.
Function created.
WTO> select cerca('ABRACADABRA ABBIAMO messo la stringa AB','AB')
2 from dual;
CERCA('ABRACADABRAABBIAMOMESSOLASTRINGAAB','AB')
-----------------------------------------------4
447
Funzione creata.
WTO>select cerca('ABRACADABRA ABBIAMO messo la stringa AB','AB')
2
from dual;
CERCA('ABRACADABRAABBIAMOMESSOLASTRINGAAB','AB')
-----------------------------------------------4
Function created.
WTO> select cerca('ABRACADABRA ABBIAMO messo la stringa AB','AB')
2 from dual;
CERCA('ABRACADABRAABBIAMOMESSOLASTRINGAAB','AB')
-----------------------------------------------4
WTO> select banner
2 from v$version where rownum=1;
BANNER
---------------------------------------------------------------Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Prod
448
WTO>
2
3
4
5
6
7
8
9
10
11
Funzione creata.
WTO> select cerca('ABRACADABRA ABBIAMO messo la stringa AB','AB')
2
from dual;
CERCA('ABRACADABRAABBIAMOMESSOLASTRINGAAB','AB')
-----------------------------------------------4
WTO>
2
select banner
from v$version where rownum=1;
BANNER
-------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 Production
449
Package created.
WTO>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Procedure created.
450
8.9.7
Funzione creata.
WTO> select stringa2data('2010-01-31')
2 from dual;
STRINGA2D
--------31-GEN-10
WTO> select stringa2data('werrwer')
2 from dual;
select stringa2data('werrwer')
*
ERRORE alla riga 1:
ORA-01841: l'anno (completo) deve essere compreso tra -4713 e
+9999, ed essere
diverso da 0
ORA-06512: a "WTO_ESEMPIO.STRINGA2DATA", line 4
451
Funzione creata.
WTO> set serverout on
WTO> select stringa2data('werrwer')
2 from dual;
STRINGA2D
---------
452
WTO>
2
3
4
Package creato.
WTO>
2
3
4
5
6
7
8
Package creato.
453
Package creato.
begin
pack.var := 1;
end;
/
454
Package creato.
WTO> begin
2 pack.var := 1;
3 dbms_output.put_line('Var='||pack.var);
4 end;
5 /
Var=1
Procedura PL/SQL completata correttamente.
WTO> exec dbms_output.put_line('Var='||pack.var);
Var=
Procedura PL/SQL completata correttamente.
455
WTO>
2
3
4
5
6
7
Funzione creata.
WTO>
2
3
4
5
6
7
8
Funzione creata.
WTO> select sum(sal), getsal, getsal_AT
2 from emp;
SUM(SAL)
GETSAL GETSAL_AT
---------- ---------- ---------29025
29025
29025
Aggiornate 14 righe.
WTO> select sum(sal), getsal, getsal_AT
2 from emp;
SUM(SAL)
GETSAL GETSAL_AT
---------- ---------- ---------140
140
29025
456
Ad esempio se il codice
declare
totale number;
begin
totale := calcola_nominali + calcola_interessi;
end;
457
declare
totale number;
begin
PRAGMA INLINE(calcola_nominali,'NO');
totale := calcola_nominali + calcola_interessi;
end;
458
8.9.8
PL/SQL Trace
che
restituisce
la
versione
del
package
SET_PLSQL_TRACE
Procedura che avvia una sessione di tracing impostando il livello
di tracing.
Per fare un semplice test creiamo una semplice funzione
ricorsiva ed una procedura che la chiama:
WTO>
2
3
4
5
6
7
8
9
10
Function created.
WTO>
2
3
4
5
6
Procedure created.
459
Tipo
---------------NUMBER
DATE
VARCHAR2(31)
VARCHAR2(2047)
VARCHAR2(2047)
DATE
VARCHAR2(2047)
NUMBER
VARCHAR2(2047)
VARCHAR2(256)
Tipo
---------------NUMBER
NUMBER
DATE
NUMBER
NUMBER
VARCHAR2(4000)
VARCHAR2(31)
VARCHAR2(31)
VARCHAR2(31)
NUMBER
VARCHAR2(31)
NUMBER
VARCHAR2(31)
VARCHAR2(4000)
VARCHAR2(31)
VARCHAR2(31)
VARCHAR2(31)
NUMBER
VARCHAR2(2047)
NUMBER
NUMBER
NUMBER
VARCHAR2(2047)
VARCHAR2(4000)
VARCHAR2(4000)
VARCHAR2(4000)
VARCHAR2(4000)
VARCHAR2(4000)
NUMBER
CLOB
CLOB
460
begin
DBMS_TRACE.SET_PLSQL_TRACE (
DBMS_TRACE.TRACE_ALL_CALLS+
DBMS_TRACE.TRACE_ALL_EXCEPTIONS+
DBMS_TRACE.TRACE_ALL_SQL);
end;
/
1
2
4
8
16
32
64
128
256
32768
65536
461
462
463
19
20
21
22
23
24
Selezionate 24 righe.
464
8.9.9
PL/SQL Profiling
Type
---------------NUMBER
NUMBER
VARCHAR2(32)
DATE
VARCHAR2(2047)
NUMBER
VARCHAR2(2047)
VARCHAR2(2047)
VARCHAR2(256)
Type
---------------NUMBER
NUMBER
VARCHAR2(32)
VARCHAR2(32)
VARCHAR2(32)
DATE
NUMBER
NUMBER
NUMBER
465
Type
---------------NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
NUMBER
Default?
-------DEFAULT
DEFAULT
Default?
-------DEFAULT
DEFAULT
Default?
-------DEFAULT
DEFAULT
Default?
-------DEFAULT
DEFAULT
466
Mentre
se
avessimo
momentaneamente avremmo usato:
voluto
interromperla
solo
exec DBMS_PROFILER.FLUSH_DATA
467
UNIT_NAME
-------------<anonymous>
<anonymous>
P1
F1
<anonymous>
<anonymous>
<anonymous>
<anonymous>
<anonymous>
9 rows selected.
468
Type
---------------NUMBER
TIMESTAMP(6)
NUMBER(38)
VARCHAR2(2047)
Type
---------------NUMBER
NUMBER
VARCHAR2(32)
VARCHAR2(32)
VARCHAR2(32)
VARCHAR2(4000)
NUMBER
RAW(32)
VARCHAR2(32)
NUMBER(38)
NUMBER(38)
NUMBER(38)
469
MODULE
TYPE
FUNCTION
LINE#
----------- ------------ ------------------------ ----__anony
0
__plsql_vm
0
F1
FUNCTION
F1
1
F1
FUNCTION
F1@1
1
F1
FUNCTION
F1@2
1
F1
FUNCTION
F1@3
1
P1
PROCEDURE
P1
1
DBMS_HPROF PACKAGE BODY STOP_PROFILING
53
DBMS_OUTPUT PACKAGE BODY GET_LINE
129
DBMS_OUTPUT PACKAGE BODY GET_LINES
180
F1
FUNCTION
__static_sql_exec_line4
4
11 rows selected.
Singole chiamate
(PARENTSYMID il codice del chiamante, CHILDSYMID il
codice del chiamato). I tempi qui sono tutti in microsecondi.
470
471
9 XML DB
9.1
Il tipo XMLType
472
9.2
Tipo
-------------------NUMBER(4)
VARCHAR2(10)
VARCHAR2(9)
NUMBER(4)
DATE
NUMBER(7,2)
NUMBER(7,2)
NUMBER(2)
473
474
475
476
<DIPENDENTE><NOME>MILLER</NOME><STIPENDIO>1300</STIPENDIO>
<IMPIEGO>CLERK</IMPIEGO><CAPO>7782</CAPO></DIPENDENTE>
Selezionate 14 righe.
477
select xmlelement('DIPENDENTE',
xmlattributes(deptno as 'dip',hiredate as 'data'),
xmlforest(ename as 'NOME', sal as 'STIPENDIO',
job as 'IMPIEGO', mgr as 'CAPO')) dip from emp
DIP
------------------------------------------------------------<DIPENDENTE dip='20' data='1980-1217'><NOME>SMITH</NOME><STIPENDIO>800</STIPENDIO>
<IMPIEGO>CLERK</IMPIEGO><CAPO>7902</CAPO></DIPENDENTE>
<DIPENDENTE dip='30' data='1981-0220'><NOME>ALLEN</NOME><STIPENDIO>1600</STIPENDIO>
<IMPIEGO>SALESMAN</IMPIEGO><CAPO>7698</CAPO></DIPENDENTE>
<DIPENDENTE dip='30' data='1981-0222'><NOME>WARD</NOME><STIPENDIO>1250</STIPENDIO>
<IMPIEGO>SALESMAN</IMPIEGO><CAPO>7698</CAPO></DIPENDENTE>
<DIPENDENTE dip='20' data='1981-0402'><NOME>JONES</NOME><STIPENDIO>2975</STIPENDIO>
<IMPIEGO>MANAGER</IMPIEGO><CAPO>7839</CAPO></DIPENDENTE>
<DIPENDENTE dip='30' data='1981-0928'><NOME>MARTIN</NOME><STIPENDIO>1250</STIPENDIO>
<IMPIEGO>SALESMAN</IMPIEGO><CAPO>7698</CAPO></DIPENDENTE>
<DIPENDENTE dip='30' data='1981-0501'><NOME>BLAKE</NOME><STIPENDIO>2850</STIPENDIO>
<IMPIEGO>MANAGER</IMPIEGO><CAPO>7839</CAPO></DIPENDENTE>
<DIPENDENTE dip='10' data='1981-0609'><NOME>CLARK</NOME><STIPENDIO>2450</STIPENDIO>
<IMPIEGO>MANAGER</IMPIEGO><CAPO>7839</CAPO></DIPENDENTE>
<DIPENDENTE dip='20' data='1982-1209'><NOME>SCOTT</NOME><STIPENDIO>3000</STIPENDIO>
<IMPIEGO>ANALYST</IMPIEGO><CAPO>7566</CAPO></DIPENDENTE>
<DIPENDENTE dip='10' data='1981-1117'><NOME>KING</NOME><STIPENDIO>5000</STIPENDIO>
<IMPIEGO>PRESIDENT</IMPIEGO></DIPENDENTE>
<DIPENDENTE dip='30' data='1981-0908'><NOME>TURNER</NOME><STIPENDIO>1500</STIPENDIO>
<IMPIEGO>SALESMAN</IMPIEGO><CAPO>7698</CAPO></DIPENDENTE>
<DIPENDENTE dip='20' data='1983-0112'><NOME>ADAMS</NOME><STIPENDIO>1100</STIPENDIO>
<IMPIEGO>CLERK</IMPIEGO><CAPO>7788</CAPO></DIPENDENTE>
<DIPENDENTE dip='30' data='1981-1203'><NOME>JAMES</NOME><STIPENDIO>950</STIPENDIO>
<IMPIEGO>CLERK</IMPIEGO><CAPO>7698</CAPO></DIPENDENTE>
<DIPENDENTE dip='20' data='1981-1203'><NOME>FORD</NOME><STIPENDIO>3000</STIPENDIO>
<IMPIEGO>ANALYST</IMPIEGO><CAPO>7566</CAPO></DIPENDENTE>
<DIPENDENTE dip='10' data='1982-0123'><NOME>MILLER</NOME><STIPENDIO>1300</STIPENDIO>
<IMPIEGO>CLERK</IMPIEGO><CAPO>7782</CAPO></DIPENDENTE>
Selezionate 14 righe.
478
479
480
<NOME>SCOTT</NOME>
<STIPENDIO>3000</STIPENDIO>
<IMPIEGO>ANALYST</IMPIEGO>
<CAPO>7566</CAPO>
</DIPENDENTE>
<DIPENDENTE dip='10' data='1981-11-17'>
<NOME>KING</NOME>
<STIPENDIO>5000</STIPENDIO>
<IMPIEGO>PRESIDENT</IMPIEGO>
</DIPENDENTE>
<DIPENDENTE dip='30' data='1981-09-08'>
<NOME>TURNER</NOME>
<STIPENDIO>1500</STIPENDIO>
<IMPIEGO>SALESMAN</IMPIEGO>
<CAPO>7698</CAPO>
</DIPENDENTE>
<DIPENDENTE dip='20' data='1983-01-12'>
<NOME>ADAMS</NOME>
<STIPENDIO>1100</STIPENDIO>
<IMPIEGO>CLERK</IMPIEGO>
<CAPO>7788</CAPO>
</DIPENDENTE>
<DIPENDENTE dip='30' data='1981-12-03'>
<NOME>JAMES</NOME>
<STIPENDIO>950</STIPENDIO>
<IMPIEGO>CLERK</IMPIEGO>
<CAPO>7698</CAPO>
</DIPENDENTE>
<DIPENDENTE dip='20' data='1981-12-03'>
<NOME>FORD</NOME>
<STIPENDIO>3000</STIPENDIO>
<IMPIEGO>ANALYST</IMPIEGO>
<CAPO>7566</CAPO>
</DIPENDENTE>
<DIPENDENTE dip='10' data='1982-01-23'>
<NOME>MILLER</NOME>
<STIPENDIO>1300</STIPENDIO>
<IMPIEGO>CLERK</IMPIEGO>
<CAPO>7782</CAPO>
</DIPENDENTE>
</DIPENDENTI>
481
482
<NOME>FORD</NOME>
<STIPENDIO>3000</STIPENDIO>
</DIPENDENTE>
</DIPENDENTI>
</DIPARTIMENTO>
<DIPARTIMENTO>
<CODICE>30</CODICE>
<DESCRIZIONE>SALES</DESCRIZIONE>
<DIPENDENTI>
<DIPENDENTE>
<NOME>ALLEN</NOME>
<STIPENDIO>1600</STIPENDIO>
</DIPENDENTE>
<DIPENDENTE>
<NOME>WARD</NOME>
<STIPENDIO>1250</STIPENDIO>
</DIPENDENTE>
<DIPENDENTE>
<NOME>MARTIN</NOME>
<STIPENDIO>1250</STIPENDIO>
</DIPENDENTE>
<DIPENDENTE>
<NOME>BLAKE</NOME>
<STIPENDIO>2850</STIPENDIO>
</DIPENDENTE>
<DIPENDENTE>
<NOME>TURNER</NOME>
<STIPENDIO>1500</STIPENDIO>
</DIPENDENTE>
<DIPENDENTE>
<NOME>JAMES</NOME>
<STIPENDIO>950</STIPENDIO>
</DIPENDENTE>
</DIPENDENTI>
</DIPARTIMENTO>
<DIPARTIMENTO>
<CODICE>40</CODICE>
<DESCRIZIONE>OPERATIONS</DESCRIZIONE>
<DIPENDENTI/>
</DIPARTIMENTO>
</DIPARTIMENTI>
483
484
<nome>MILLER</nome>
<dipartimento>10</dipartimento>
<STIPENDIO>1300</STIPENDIO>
Selezionate 14 righe.
Processing Instructions
Prologo
Commenti
Sezioni CDATA
485
486
<ENAME>KING</ENAME>
<DEPTNO>10</DEPTNO>
<SAL>5000</SAL>
</Emp>
<Emp>
<ENAME>TURNER</ENAME>
<DEPTNO>30</DEPTNO>
<SAL>1500</SAL>
</Emp>
<Emp>
<ENAME>ADAMS</ENAME>
<DEPTNO>20</DEPTNO>
<SAL>1100</SAL>
</Emp>
<Emp>
<ENAME>JAMES</ENAME>
<DEPTNO>30</DEPTNO>
<SAL>950</SAL>
</Emp>
<Emp>
<ENAME>FORD</ENAME>
<DEPTNO>20</DEPTNO>
<SAL>3000</SAL>
</Emp>
<Emp>
<ENAME>MILLER</ENAME>
<DEPTNO>10</DEPTNO>
<SAL>1300</SAL>
</Emp>
</Emps>
487
488
</Emp>
<Emp>
<ENAME>TURNER</ENAME>
<DEPTNO>30</DEPTNO>
<SAL>1500</SAL>
</Emp>
<Emp>
<ENAME>ADAMS</ENAME>
<DEPTNO>20</DEPTNO>
<SAL>1100</SAL>
</Emp>
<Emp>
<ENAME>JAMES</ENAME>
<DEPTNO>30</DEPTNO>
<SAL>950</SAL>
</Emp>
<Emp>
<ENAME>FORD</ENAME>
<DEPTNO>20</DEPTNO>
<SAL>3000</SAL>
</Emp>
<Emp>
<ENAME>MILLER</ENAME>
<DEPTNO>10</DEPTNO>
<SAL>1300</SAL>
</Emp>
</Emps>
489
490
491
<ROW>
<EMPNO>7844</EMPNO><DEPTNO>30</DEPTNO><SAL>1500</SAL></ROW>
<?xml version="1.0"?>
<ROW>
<EMPNO>7876</EMPNO><DEPTNO>20</DEPTNO><SAL>1100</SAL></ROW>
<?xml version="1.0"?>
<ROW>
<EMPNO>7900</EMPNO><DEPTNO>30</DEPTNO><SAL>950</SAL></ROW>
<?xml version="1.0"?>
<ROW>
<EMPNO>7902</EMPNO><DEPTNO>20</DEPTNO><SAL>3000</SAL></ROW>
<?xml version="1.0"?>
<ROW>
<EMPNO>7934</EMPNO><DEPTNO>10</DEPTNO><SAL>1300</SAL></ROW>
Selezionate 14 righe.
492
493
Per concludere
DBMS_XMLGEN.
l'argomento
introduciamo
il
package
494
<MGR>7698</MGR>
<HIREDATE>22-FEB-81</HIREDATE>
<SAL>1250</SAL>
<COMM>500</COMM>
<DEPTNO>30</DEPTNO>
</DIPENDENTE>
<DIPENDENTE>
<EMPNO>7566</EMPNO>
<ENAME>JONES</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>02-APR-81</HIREDATE>
<SAL>2975</SAL>
<DEPTNO>20</DEPTNO>
</DIPENDENTE>
<DIPENDENTE>
<EMPNO>7654</EMPNO>
<ENAME>MARTIN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>28-SET-81</HIREDATE>
<SAL>1250</SAL>
<COMM>1400</COMM>
<DEPTNO>30</DEPTNO>
</DIPENDENTE>
<DIPENDENTE>
<EMPNO>7698</EMPNO>
<ENAME>BLAKE</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>01-MAG-81</HIREDATE>
<SAL>2850</SAL>
<DEPTNO>30</DEPTNO>
</DIPENDENTE>
<DIPENDENTE>
<EMPNO>7782</EMPNO>
<ENAME>CLARK</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>09-GIU-81</HIREDATE>
<SAL>2450</SAL>
<DEPTNO>10</DEPTNO>
</DIPENDENTE>
<DIPENDENTE>
<EMPNO>7788</EMPNO>
<ENAME>SCOTT</ENAME>
<JOB>ANALYST</JOB>
<MGR>7566</MGR>
<HIREDATE>09-DIC-82</HIREDATE>
<SAL>3000</SAL>
<DEPTNO>20</DEPTNO>
495
</DIPENDENTE>
<DIPENDENTE>
<EMPNO>7839</EMPNO>
<ENAME>KING</ENAME>
<JOB>PRESIDENT</JOB>
<HIREDATE>17-NOV-81</HIREDATE>
<SAL>5000</SAL>
<DEPTNO>10</DEPTNO>
</DIPENDENTE>
<DIPENDENTE>
<EMPNO>7844</EMPNO>
<ENAME>TURNER</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>08-SET-81</HIREDATE>
<SAL>1500</SAL>
<COMM>0</COMM>
<DEPTNO>30</DEPTNO>
</DIPENDENTE>
<DIPENDENTE>
<EMPNO>7876</EMPNO>
<ENAME>ADAMS</ENAME>
<JOB>CLERK</JOB>
<MGR>7788</MGR>
<HIREDATE>12-GEN-83</HIREDATE>
<SAL>1100</SAL>
<DEPTNO>20</DEPTNO>
</DIPENDENTE>
<DIPENDENTE>
<EMPNO>7900</EMPNO>
<ENAME>JAMES</ENAME>
<JOB>CLERK</JOB>
<MGR>7698</MGR>
<HIREDATE>03-DIC-81</HIREDATE>
<SAL>950</SAL>
<DEPTNO>30</DEPTNO>
</DIPENDENTE>
<DIPENDENTE>
<EMPNO>7902</EMPNO>
<ENAME>FORD</ENAME>
<JOB>ANALYST</JOB>
<MGR>7566</MGR>
<HIREDATE>03-DIC-81</HIREDATE>
<SAL>3000</SAL>
<DEPTNO>20</DEPTNO>
</DIPENDENTE>
<DIPENDENTE>
<EMPNO>7934</EMPNO>
<ENAME>MILLER</ENAME>
<JOB>CLERK</JOB>
<MGR>7782</MGR>
496
<HIREDATE>23-GEN-82</HIREDATE>
<SAL>1300</SAL>
<DEPTNO>10</DEPTNO>
</DIPENDENTE>
</DIPENDENTI>
9.3
497
Vediamo un esempio:
WTO> update myxml set
2 x=INSERTXMLAFTER(x,
3
'//EMPNO[text()=7521]',
4
xmlelement("newel",'newval')
5
);
1 row updated.
WTO> select xmlserialize(document x) from myxml;
XMLSERIALIZE(DOCUMENTX)
-------------------------------------------------------<emps>
<employee>
<EMPNO>7369</EMPNO>
<ENAME>SMITH</ENAME>
<JOB>CLERK</JOB>
<SAL>800</SAL>
</employee>
<employee>
<EMPNO>7499</EMPNO>
<ENAME>ALLEN</ENAME>
<JOB>SALESMAN</JOB>
<SAL>1600</SAL>
</employee>
<employee>
<EMPNO>7521</EMPNO>
<newel>newval</newel>
<ENAME>WARD</ENAME>
<JOB>SALESMAN</JOB>
<SAL>1250</SAL>
</employee>
</emps>
498
la
funzione
APPENDCHILDXML. Questa, infatti, inserisce il nuovo elemento come
figlio (e dunque ad un livello inferiore nell'albero gerarchico)
dell'elemento a cui punta l'espressione XPATH:
499
500
501
502
9.4
503
504
505
Y
-----------------------------<emps>
<employee>
<EMPNO>7369</EMPNO>
<ENAME>TOM</ENAME>
<JOB>CLERK</JOB>
<SAL>800</SAL>
</employee>
<employee>
<EMPNO>7499</EMPNO>
<ENAME>ALLEN</ENAME>
<JOB>SALESMAN</JOB>
<SAL>3000</SAL>
</employee>
<employee>
<EMPNO>7521</EMPNO>
<ENAME>WARD</ENAME>
<JOB>SALESMAN</JOB>
<SAL>1250</SAL>
</employee>
</emps>
506
507
9.5
un'apposita
WTO> BEGIN
2
DBMS_XMLSCHEMA.registerSchema(
3
SCHEMAURL => 'http://www.mysite.com/xsd/TestSchema.xsd',
4
SCHEMADOC => bfilename('FILE_DIR','TestSchema.xsd'),
5
CSID => nls_charset_id('WE8MSWIN1252'));
6 END;
7 /
Procedura PL/SQL completata correttamente.
508
509
510
511
OBJECT_NAME
----------------------------------COMPLETE_NAME_TYPE641_T
TRAINER643_T
PLAYER645_T
PLAYER646_COLL
PLAYERS644_T
TEAM642_T
TEAM647_TAB
SYS_NTZYupEfMzS22Q1xVs8KDURg==
SYS_C009978
SYS_LOB0000070864C00010$$
SYS_LOB0000070864C00004$$
SYS_C009979
SYS_XDBPD$651_L
SYS_XDBPD$650_L
SYS_XDBPD$649_L
SYS_XDBPD$648_L
EXTRADATA652_L
NAMESPACES653_L
SYS_C009980
TEAM647_TAB$xd
OBJECT_TYPE
----------------TYPE
TYPE
TYPE
TYPE
TYPE
TYPE
TABLE
TABLE
INDEX
LOB
LOB
INDEX
LOB
LOB
LOB
LOB
LOB
LOB
INDEX
TRIGGER
TO_CHA
-----002858
002859
002859
002859
002900
002900
002905
002906
002901
002900
002900
002901
002901
002901
002901
002901
002901
002901
002901
002905
Selezionate 20 righe.
WTO> desc COMPLETE_NAME_TYPE641_T
COMPLETE_NAME_TYPE641_T NOT FINAL
Nome
Nullo?
---------------------------- -------SYS_XDBPD$
SURNAME
NAME
WTO> desc TRAINER643_T
Nome
Nullo?
------------------------- -------SYS_XDBPD$
fifa_id
TR_COMPL_NAME
NATIONALITY
Tipo
-----------------------XDB.XDB$RAW_LIST_T
VARCHAR2(4000 CHAR)
VARCHAR2(4000 CHAR)
Tipo
---------------------------XDB.XDB$RAW_LIST_T
VARCHAR2(10 CHAR)
COMPLETE_NAME_TYPE641_T
VARCHAR2(4000 CHAR)
512
SCHEMA_URL
----------------------------------------------------http://www.mysite.com/xsd/TestSchema.xsd
http://xmlns.oracle.com/xdb/stats.xsd
http://xmlns.oracle.com/xdb/xdbconfig.xsd
http://xmlns.oracle.com/xs/dataSecurity.xsd
http://xmlns.oracle.com/xs/aclids.xsd
http://xmlns.oracle.com/xdb/XDBSchema.xsd
http://xmlns.oracle.com/xdb/XDBResource.xsd
http://www.w3.org/2001/csx.xml.xsd
http://xmlns.oracle.com/xdb/csx.xmltr.xsd
http://xmlns.oracle.com/xdb/acl.xsd
http://xmlns.oracle.com/xdb/dav.xsd
http://xmlns.oracle.com/xdb/XDBResConfig.xsd
http://xmlns.oracle.com/xdb/XDBStandard.xsd
http://xmlns.oracle.com/xdb/log/xdblog.xsd
http://xmlns.oracle.com/xdb/log/ftplog.xsd
http://xmlns.oracle.com/xdb/log/httplog.xsd
http://www.w3.org/2001/xml.xsd
http://xmlns.oracle.com/xdb/xmltr.xsd
http://xmlns.oracle.com/xdb/XDBFolderListing.xsd
http://www.w3.org/1999/xlink.xsd
http://www.w3.org/1999/csx.xlink.xsd
http://www.w3.org/2001/XInclude.xsd
http://www.w3.org/2001/csx.XInclude.xsd
513
514
WTO>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Creata 1 riga.
515
516
un
aggiornamento
517
9.6
518
),
'Stipendio'
)
)
),
xmlagg(
xmlelement("ss:Row",
xmlelement("ss:Cell",
xmlelement(
"ss:Data",
xmlattributes(
'String' as "ss:Type"
),
ename )
),
xmlelement("ss:Cell",
xmlelement(
"ss:Data",
xmlattributes(
'Number' as "ss:Type"
),
sal
)
)
)
)
)
)
)
, VERSION '1.0'
) MyDoc
from emp;
MYDOC
-------------------------------------------------------------<?xml version="1.0"?>
<ss:Workbook xmlns:ss="urn:schemas-microsoftcom:office:spreadsheet">
<ss:Worksheet ss:Name="Dipendenti">
<ss:Table>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="String">Nome</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">Stipendio</ss:Data>
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="String">SMITH</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="Number">800</ss:Data>
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="String">ALLEN</ss:Data>
519
</ss:Cell>
<ss:Cell>
<ss:Data
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data
</ss:Cell>
<ss:Cell>
<ss:Data
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data
</ss:Cell>
<ss:Cell>
<ss:Data
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data
</ss:Cell>
<ss:Cell>
<ss:Data
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data
</ss:Cell>
<ss:Cell>
<ss:Data
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data
</ss:Cell>
<ss:Cell>
<ss:Data
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data
</ss:Cell>
<ss:Cell>
<ss:Data
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data
</ss:Cell>
<ss:Cell>
520
ss:Type="Number">1600</ss:Data>
ss:Type="String">WARD</ss:Data>
ss:Type="Number">1250</ss:Data>
ss:Type="String">JONES</ss:Data>
ss:Type="Number">2975</ss:Data>
ss:Type="String">MARTIN</ss:Data>
ss:Type="Number">1250</ss:Data>
ss:Type="String">BLAKE</ss:Data>
ss:Type="Number">2850</ss:Data>
ss:Type="String">CLARK</ss:Data>
ss:Type="Number">2450</ss:Data>
ss:Type="String">SCOTT</ss:Data>
ss:Type="Number">3000</ss:Data>
ss:Type="String">KING</ss:Data>
<ss:Data
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data
</ss:Cell>
<ss:Cell>
<ss:Data
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data
</ss:Cell>
<ss:Cell>
<ss:Data
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data
</ss:Cell>
<ss:Cell>
<ss:Data
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data
</ss:Cell>
<ss:Cell>
<ss:Data
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data
</ss:Cell>
<ss:Cell>
<ss:Data
</ss:Cell>
</ss:Row>
</ss:Table>
</ss:Worksheet>
</ss:Workbook>
ss:Type="Number">5000</ss:Data>
ss:Type="String">TURNER</ss:Data>
ss:Type="Number">1500</ss:Data>
ss:Type="String">ADAMS</ss:Data>
ss:Type="Number">1100</ss:Data>
ss:Type="String">JAMES</ss:Data>
ss:Type="Number">950</ss:Data>
ss:Type="String">FORD</ss:Data>
ss:Type="Number">3000</ss:Data>
ss:Type="String">MILLER</ss:Data>
ss:Type="Number">1300</ss:Data>
521
522
523
Che equivalente a:
524
Select
xmlroot(
xmlelement(
"ss:Workbook"
,XMLATTRIBUTES(
'urn:schemas-microsoft-com:office:spreadsheet'
as "xmlns:ss"
),
xmlelement(
"ss:Worksheet",
XMLATTRIBUTES('Dipendenti' as "ss:Name")
,xmlelement("ss:Table",
x.XRow(x.SCell('Nome'),
x.SCell('Stipendio')),
(select xmlagg(x.XRow(x.SCell(ename),
x.NCell(sal)))
from emp
)
)
)
)
, VERSION '1.0'
) MyDoc
from dual;
525
)
)
from emp
)
)
)
)
, VERSION '1.0'
) MyDoc
from dual;
MYDOC
----------------------------------------------------------------<?xml version="1.0"?>
<ss:Workbook xmlns:ss="urn:schemas-microsoftcom:office:spreadsheet">
<ss:Worksheet ss:Name="Dipendenti">
<ss:Table>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="String">Matricola</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">Nome</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">Impiego</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">Manager</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">Assunzione</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">Stipendio</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">Commissioni</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">Dipartimento</ss:Data>
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="Number">7369</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">SMITH</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">CLERK</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="Number">7902</ss:Data>
</ss:Cell>
<ss:Cell>
526
<ss:Data ss:Type="Date">1980-12-17</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="Number">800</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="Number"/>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="Number">20</ss:Data>
</ss:Cell>
</ss:Row>
-- ALTRE 13 RIGHE RIMOSSE -</ss:Table>
</ss:Worksheet>
</ss:Workbook>
527
528
529
</ss:Row>
</ss:Table>
</ss:Worksheet>
530
end if;
if formato like '%I%' then
if retVal is not null then
select XMLELEMENT("I",retVal)
into retVal
from dual;
else
select XMLELEMENT("I",in_val)
into retVal
from dual;
end if;
end if;
if formato like '%S%' then
if retVal is not null then
select XMLELEMENT("S",retVal)
into retVal
from dual;
else
select XMLELEMENT("S",in_val)
into retVal
from dual;
end if;
end if;
return retVal;
end;
function NCell(in_val in number, formato in varchar2 default
null) return XMLType is
valForm XMLType;
retval XMLType;
begin
if formato is not null then
valForm := formatta(to_char(in_val),formato);
select xmlelement("ss:Cell",
xmlelement(
"ss:Data",
xmlattributes(
'Number' as "ss:Type"
),
valForm)
)
into retVal
from dual;
else
select xmlelement("ss:Cell",
xmlelement(
"ss:Data",
xmlattributes(
'Number' as "ss:Type"
),
in_val)
)
into retVal
from dual;
end if;
return retVal;
end;
531
532
into retVal
from dual;
end if;
return retVal;
end;
function XRow(in1 in XMLType,
in2 in XMLType default null,
in3 in XMLType default null,
in4 in XMLType default null,
in5 in XMLType default null,
in6 in XMLType default null,
in7 in XMLType default null,
in8 in XMLType default null,
in9 in XMLType default null,
in10 in XMLType default null
) return XMLType is
retVal XMLType;
begin
select XMLELEMENT("ss:Row",
XMLCONCAT(in1,in2,in3,in4,in5,
in6,in7,in8,in9,in10)
)
into retVal
from dual;
return retVal;
end;
end;
/
B - Grassetto
U - Sottolineato
I - Corsivo
S - Barrato
533
xmlelement("ss:Column",
xmlattributes('100' as "ss:Width")),
xmlelement("ss:Column",
xmlattributes('100' as "ss:Width")),
xmlelement("ss:Column",
xmlattributes('100' as "ss:Width")),
xmlelement("ss:Column",
xmlattributes('100' as "ss:Width")),
xmlelement("ss:Column",
xmlattributes('100' as "ss:Width")),
xmlelement("ss:Column",
xmlattributes('100' as "ss:Width")),
xmlelement("ss:Column",
xmlattributes('100' as "ss:Width")),
x.XRow(x.SCell('Matricola','B'),
x.SCell('Nome','B'),
x.SCell('Impiego','B'),
x.SCell('Manager','B'),
x.SCell('Assunzione','B'),
x.SCell('Stipendio','B'),
x.SCell('Commissioni','B'),
x.SCell('Dipartimento','B')
),
(select xmlagg(x.XRow(x.NCell(empno),
x.SCell(ename,'I'),
x.SCell(job,'I'),
x.NCell(mgr),
x.DCell(hiredate),
x.NCell(sal),
x.NCell(comm),
x.NCell(deptno)
)
)
from emp
)
)
),
xmlelement(
"ss:Worksheet",
XMLATTRIBUTES('Dipartimenti' as "ss:Name")
,xmlelement("ss:Table",
xmlelement("ss:Column",
xmlattributes('100' as "ss:Width")),
xmlelement("ss:Column",
xmlattributes('100' as "ss:Width")),
xmlelement("ss:Column",
xmlattributes('100' as "ss:Width")),
x.XRow(x.SCell('Codice','B'),
x.SCell('Nome','B'),
x.SCell('Ubicazione','B')
),
(select xmlagg(x.XRow(x.NCell(deptno),
x.SCell(dname),
x.SCell(loc)
)
)
from dept
)
534
)
)
)
, VERSION '1.0'
) MyDoc
from dual;
535
</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">
<B>Dipartimento</B>
</ss:Data>
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="Number">7369</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">
<I>SMITH</I>
</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">
<I>CLERK</I>
</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="Number">7902</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="DateTime">1980-12-17</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="Number">800</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="Number"/>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="Number">20</ss:Data>
</ss:Cell>
</ss:Row>
--Tante altre righe di EMP-</ss:Table>
</ss:Worksheet>
<ss:Worksheet ss:Name="Dipartimenti">
<ss:Table>
<ss:Column ss:Width="100"/>
<ss:Column ss:Width="100"/>
<ss:Column ss:Width="100"/>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="String">
<B>Codice</B>
</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">
<B>Nome</B>
</ss:Data>
</ss:Cell>
<ss:Cell>
536
<ss:Data ss:Type="String">
<B>Ubicazione</B>
</ss:Data>
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="Number">10</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">ACCOUNTING</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">NEW YORK</ss:Data>
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="Number">20</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">RESEARCH</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">DALLAS</ss:Data>
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="Number">30</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">SALES</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">CHICAGO</ss:Data>
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="Number">40</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">OPERATIONS</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">BOSTON</ss:Data>
</ss:Cell>
</ss:Row>
</ss:Table>
</ss:Worksheet>
</ss:Workbook>
537
538
10 Prerequisiti
539
Codice Cliente
Nome
Cognome
Telefono
111111
Alberto
Rossi
0666778899
222222
Giovanni
Verdi
0233445566
333333
Stefano
Bianchi
0819988774
Tabella FATTURE
Numero Fattura
Importo
Data scadenza
Codice Cliente
1000,00
01/10/2010
111111
1200,00
01/11/2010
111111
800,00
21/10/2010
222222
1000,00
31/10/2010
222222
2000,00
01/12/2010
222222
540
Il DBA
(database administrator)
un professionista
dellinformatica che si occupa di installare, aggiornare e gestire uno o
pi database. Tutte le grandi organizzazioni hanno alle proprie
dipendenze, direttamente o mediante contratti di consulenza stipulati
con altre aziende, un gruppo di DBA che gestisce i database aziendali.
Si tratta di una figura professionale molto critica visto che il vero
patrimonio di tante grandi aziende sta soprattutto nei dati che esse
gestiscono.
541
542
Cognome
Indirizzo
Comune
Prov.
Telefono
111111
Rossi
Via Rossi, 2
Pomezia
RM
Casa 0666778899
Cell 3351234567
222222
Verdi
Via Verdi, 1
Rho
MI
Casa 0233445566
Cell 3387654321
333333
Bianchi
Via Bianchi, 3
Casoria
NA
Casa 0819988774
Cell 3491234567
444444
Gialli
Via Gialli, 1
Rho
MI
Cell 3177654321
Cognome
Indirizzo
Comune
Prov.
Tel. Casa
Tel. Cell
111111
Rossi
Via Rossi, 2
Pomezia
RM
0666778899
3351234567
222222
Verdi
Via Verdi, 1
Rho
MI
0233445566
3387654321
0819988774
333333
Bianchi
Via Bianchi, 3
Casoria
NA
444444
Gialli
Via Gialli, 1
Rho
MI
3491234567
3177654321
543
Cod.
Prodotto
data
Descr. prodotto
Quantit
111111
XY123
1/9/2010
Bulloni mis. 8
200
111111
AZ321
1/9/2010
Viti da 5mm
100
222222
AS333
3/9/2010
Viti da 7mm
130
333333
AZ321
5/9/2010
Viti da 5mm
230
444444
XY123
7/9/2010
Bulloni mis. 8
150
544
Cod.
Prodotto
Quantit
111111
XY123
200
111111
AZ321
100
222222
AS333
130
333333
AZ321
230
444444
XY123
150
Tabella ORDINI
Num.
Ordine
data
111111
1/9/2010
222222
3/9/2010
333333
5/9/2010
444444
7/9/2010
Tabella PRODOTTI
Cod.
Prodotto
Descr. prodotto
XY123
Bulloni mis. 8
AZ321
Viti da 5mm
AS333
Viti da 7mm
545
Cognome
Indirizzo
Codice
Comune
Tel. Casa
Tel. Cell
111111
Rossi
Via Rossi, 2
G811
0666778899
3351234567
222222
Verdi
Via Verdi, 1
H264
0233445566
3387654321
333333
Bianchi
Via Bianchi, 3
B990
0819988774
3491234567
444444
Gialli
Via Gialli, 1
H264
Codice
Comune
Nome
Comune
Prov.
G811
Pomezia
RM
H264
Rho
MI
B990
Casoria
NA
3177654321
Tabella COMUNI
546
547
548
123 = 1 26 + 1 25 + 1 24 + 1 23 + 0 22 + 1 21 + 1 20
Sottintendendo le potenze, come facciamo solitamente nel
sistema decimale, si ottiene la rappresentazione binaria del numero
123:
1111011
Poich nel sistema binario sono disponibili solo due cifre i
numeri crescono molto rapidamente di lunghezza, ma solo un
problema di rappresentazione grafica: cinque dita sono sempre
cinque, sia che le si rappresenti con la cifra 5 che con la stringa di
cifre 101!
Esattamente nello stesso modo si ragiona con il sistema
esadecimale dove le cifre sono ben sedici, da 0 a 9 pi le lettere A, B,
C, D, E, F. Ovviamente nel caso del sistema esadecimale i numeri
avranno una rappresentazione pi corta di quella decimale. La tabella
seguente rappresenta i numeri da uno a venti in sistema decimale,
binario ed esadecimale. Anche negli altri sistemi di numerazione,
come in quello decimale, gli zeri aggiunti alla sinistra del numero non
ne cambiano il valore.
Sistema Decimale
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sistema Binario
1
10
11
100
101
110
111
1000
1001
1010
1011
1100
1101
1110
1111
10000
10001
10010
10011
10100
Sistema Esadecimale
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
10
11
12
13
14
549
550
pochi per i caratteri di molte altre lingue del mondo. Per questo motivo
la codifica ASCII stata estesa con la codifica UNICODE che basata
attualmente su 21 cifre binarie e consente di rappresentare circa un
milione di caratteri.
Non tutti i sistemi operativi sono basati sulla codifica
ASCII/Unicode. I mainframe IBM, ad esempio, utilizzano la codifica
EBCDIC, anchessa basata su otto bit ma associati differentemente ai
caratteri da rappresentare. La stringa di bit 01001101 che in ASCII
rappresenta la lettera M, in EBCDIC rappresenta la parentesi tonda
aperta (.
x = mantissa baseesponente
(1)
551
Accettando
limprecisione
dovuta
ad
un
inevitabile
arrotondamento, anche tutti i numeri reali possono essere espressi in
notazione esponenziale per di pi utilizzando un limitato numero di
cifre per rappresentare la mantissa. La rappresentazione a virgola
mobile consiste dunque nel fissare la base ed archiviare per ogni
numero sia la mantissa che lesponente. Quando il numero dovr
essere ricostruito a partire da mantissa ed esponente sar utilizzata la
formula (1).
552
553
554
(a)
(b)
(c)
555
556
557
Indice Analitico
%
%ISOPEN 334
%NOTFOUND 334
%ROWCOUNT 335
%ROWTYPE 352
%TYPE 318
A
ABS 235
ACOS 239
ADD_MONTHS 241
Aggiornamento di dati XML 497
albero bilanciato 73
Algoritmi di hash 552
Algoritmi di ricerca 552
Alias di colonna 154
ALL 291
ALTER 112
AND 173
ANY 291
Applicazioni software 548
Architettura di un computer 547
Architettura Hardware 547
Architettura Software 547
Archiver 18
ARCn 18
Aritmetica sulle date 240
Array Associativi 354
Arrestare Oracle 39
558
ASCII 234
ASCII 550
ASIN 239
Assegnazione 319
ATAN 239
ATAN2 239
AUTHID CURRENT_USER 417
AVG 187
Avviare Oracle 39
B
balanced tree 73
BEGIN 314
BETWEEN 168
binary digit 550
bit 550
Bitmap 73
BLOB 92; 422
Blocchi anonimi 314
blocco 16
BOOLEAN 317
B-tree 72
Bulk collect 360
BUS 547
Byte 550
C
CASE 268; 321
CEIL 237
Central Processing Unit 547
CHAR 89
check constraint 71
Check option 75
checkpoint 14; 17
chiave esterna 70; 541
chiave primaria 70; 541
chiave univoca 71
CHR 235
CKPT 14
client 42
CLOB 90
CLOSE 334
Cluster di tabelle 74
Cluster Index 74
COALESCE 258
Collection 360
Colonne di una tabella 69
COLUMN_VALUE 159; 473
Commenti 316
COMMIT 298
Compilazione condizionale 446
CONCAT 224
Concatenazione 221
Condizioni 160
Congiunzione 555
CONNECT BY 201
connect string 43
CONNECT_BY_ISCYCLE 158
CONNECT_BY_ISLEAF 158
Constraint 70; 75
control file 17
Conversioni implicite 248
COS 239
Costanti 318
COUNT 369
COUNT 188
CPU 547
Creare un utente 50
CREATE 92
Crittografia 425
CURRENT_DATE 245
CURRENT_TIMESTAMP 245
CURRVAL 106; 159
CURSOR FOR LOOP 336
Cursori 333
data block 16
database 13; 539
559
E
E. F. Codd 540
EBCDIC 551
Eccezioni mute 346
Eccezioni predefinite 339
Eccezioni utente 345
Email 434
END 314
Enterprise Manager 38
entit 540
Espressioni regolari 261
Estensioni Object-Oriented 78
EXCEPTION 314; 338
EXECUTE IMMEDIATE 329
EXISTS 367
EXISTS 292
EXP 237
EXTEND 365
extent 16
External Table 69
EXTRACT 246
F
FETCH 334
file di controllo 17
Firma 373; 381
FIRST 368
FLASHBACK TABLE 128
FLOOR 237
FOR 324
foreign key 70; 541
Formati
date 251
numeri 255
Funzioni 380
Funzioni di gruppo 185
AVG 187
COUNT 188
MAX 186
MIN 186
STDDEV 188
SUM 185
VARIANCE 187
Funzioni di hash 552
Funzioni PL/SQL 78
Funzioni predefinite 221
ABS 235
560
ACOS 239
ADD_MONTHS 241
ASCII 234
ASIN 239
ATAN 239
ATAN2 239
CEIL 237
CHR 235
COALESCE 258
CONCAT 224
COS 239
CURRENT_DATE 245
CURRENT_TIMESTAMP 245
DECODE 266
di conversione 248
EXP 237
EXTRACT 246
FLOOR 237
GREATEST 270
INITCAP 230
INSTR 227
LAST_DAY 243
LEAST 271
LENGTH 228
LN 238
LNNVL 260
LOG 238
LOWER 229
LPAD 232
LTRIM 230
MOD 239
MONTHS_BETWEEN 242
NEXT_DAY 243
NULLIF 261
NVL 256
NVL2 257
POWER 238
REGEXP_COUNT 264
REGEXP_INSTR 262
REGEXP_LIKE 265
REGEXP_REPLACE 263
REGEXP_SUBSTR 263
REMAINDER 239
REPLACE 233
ROUND 235; 244
RPAD 232
RTRIM 231
SIGN 238
SIN 239
SINH 239
SQRT 238
SUBSTR 225
sui numeri 235
sulle date 240
sulle stringhe 224
SYSDATE 240
SYSTIMESTAMP 240
TO_CHAR 248
TO_DATE 249
TO_NUMBER 250
TO_TIMESTAMP 250
TRANSLATE 234
TRIM 231
TRUNC 236; 244
UPPER 229
Funzioni XML
APPENDCHILDXML 499
DELETEXML 503
INSERTCHILDXML 500
INSERTXMLAFTER 497
INSERTXMLBEFORE 498
SYS_XMLAGG 492
SYS_XMLGEN 491
UPDATEXML 501
XMLAGG 479
XMLCAST 503
XMLCDATA 489
XMLCOLATTVAL 489
XMLCOMMENT 489
XMLCONCAT 483
XMLDIFF 506
XMLELEMENT 473
XMLEXISTS 504
XMLFOREST 476
XMLISVALID 515
XMLPATCH 507
XMLPI 485
XMLROOT 487
XMLSERIALIZE 480
G
GigaByte 550
GOTO 326
GRANT 310
GREATEST 270
GROUP BY 184
H
Hard Disk Drive 547
Hash 552
Hash Cluster 74
HAVING 190
I
IDE 548
IF THEN ELSE 319
IN 169
IN (subquery) 292
Indexed Cluster 74
Index-Organized Tables 73
Indice Bitmap 73
Indice B-tree 72
Indici 71
INITCAP 230
INNER JOIN 274
INSERT 130
Installazione del database 19
INSTR 227
Integrated Development
Environment 548
integrit referenziale 70; 541
INTERSECT 287
INVALID_NUMBER 340
IOT 73
IS NOT NULL 162
IS NULL 162
istanza 13; 14
J
Java Pool 15
JOIN 272
K
KiloByte 550
561
Large Pool 15
LAST 368
LAST_DAY 243
LEAST 271
Leggi di De Morgan 556
LENGTH 228
LEVEL 158
LGWR 14
LIKE 170
LIMIT 369
Linux 548
listener 42
Literals 129
LN 238
LNNVL 260
Lock 307
LOG 238
LOG ERRORS 147
log switching 17; 18
Log Writer 14
Logica delle proposizioni 554
LONG 90
LONG RAW 92
LOOP 322
LOWER 229
LPAD 232
LTRIM 230
Negazione 555
Nested Tables 359
NEXT 371
NEXT_DAY 243
NEXTVAL 106; 159
NO_DATA_FOUND 340
NOMOUNT 39
Normalizzazione 542
NOT 175
NOT BETWEEN 168
NOT IN 169
NOT LIKE 170
NULL 327
NULLIF 261
NUMBER 91
Numeri ed importi 91
NVL 256
NVL 256
NVL2 257
M
Materialized views 76
MAX 186
MegaByte 550
MERGE 142
Metodi delle collezioni 361
MIN 186
MINUS 288
MOD 239
MODEL 210
MONTHS_BETWEEN 242
MOUNT 39
multiplexed 18
562
O
Oggetti del DB 65
Oggetti PL/SQL 77
OPEN 334
OPEN 39
Operatori
aritmetici 223
di concatenazione 221
di confronto 161
logici 173
Operatori Insiemistici 283
Operatori Logici 554
congiunzione 555
disgiunzione 555
negazione 555
Regole di precedenza 555
OR 174
oradim 38
ORDER BY 179
Ordinamento 179
OTHERS 342
OUTER JOIN 277
P
Package 386
Packege PL/SQL 78
Partizioni 69
Personalizzare SQL*Plus 52
PGA 15
PIVOT 196
PL/SQL Tables 354
PMON 14
POWER 238
PRAGMA
autonomous_transaction 455
exception_init 451
inline 456
restrict_references 452
serially_reusable 454
Predicati 557
Prima forma normale 543
primary key 70; 541
PRIOR 370
Privilegi 310
Procedure 372
Procedure PL/SQL 78
Process Monitor 14
processi di base 14
Prodotto cartesiano
di insiemi 554
di tabelle 272
Profiling 465
Progettazione di un db 542
Program Global Area 15
Proiezioni 154
proposizione 554
Pseudocolonne 158
PURGE 126
RAISE_APPLICATION_ERROR
344
RAM 547
Random Access Memory 547
Rappresentazioni numeriche 551
RAW 92
RDBMS 540
Real Application Clusters 13
RECORD 351
recovery 18
Redo Log Buffer 15
Redo Log file 17; 18
REGEXP_COUNT 264
REGEXP_INSTR 262
REGEXP_LIKE 265
REGEXP_REPLACE 263
REGEXP_SUBSTR 263
relazione 541
REMAINDER 239
RENAME 122
REPLACE 233
Requisiti Hardware 19
Requisiti Software 20
RETURN 380
REVOKE 311
Ricerca Binaria 552
Ricerca Dicotomica 552
Ricerca sequenziale 552
Ricerche innestate 289
Ricerche su pi tabelle 272
ROLLBACK 300
ROLLUP 191
ROUND 235; 244
ROWID 72; 159
ROWNUM 160; 194
RPAD 232
RTRIM 231
RUOLI 311
Q
S
Query 153
Query gerarchiche 201
R
Raggruppamenti 183
RAISE 344; 349
SAVEPOINT 301
Scaricare Oracle 20
Scheduler 442
schema 41
Seconda forma normale 543
segment 17
SELECT 153
SELECTINTO 328
Selezioni 160
563
Sequenze 76
server 42
servizio client 42
SET 56
SET TRANSACTION 303
SGA 15
Shared Pool 15
shared server 43
SHOW 55
Shutdown 39
Abort 40
Immediate 40
Normal 39
Transactional 40
SIGN 238
SIN 239
SINH 239
Sinonimi 77
Sistema binario 548
Sistema esadecimale 549
Sistema operativo 548
SMON 14
SQL 87
SQL Developer 62
SQL Dinamico 329
SQL Statico 328
SQL Types 317
SQL*Plus 38; 51
SQLCODE 343
SQLERRM 343
SQRT 238
Startup 39
STDDEV 188
Stored Function 78
Stored Procedure 78
stringa di connessione 43
Subprogram Inlining 456
Subquery 289
correlate 295
Operatori di confronto 290
scorrelate 294
Subquery factoring 297
SUBSTR 225
SUM 185
SYS 41
SYSDATE 240
SYSTEM 41
System Global Area 15
System Monitor 14
System Trigger 396
SYSTIMESTAMP 240
564
T
Tabella ASCII 550
Tabelle 68
Tabelle Index-Organized 73
Table Trigger 78
tablespace 17
TCL 298
Teorema di Bohm-Jacopini 313
Teoria degli insiemi 553
Complemento 554
Differenza 554
Insieme vuoto 553
Intersezione 553
Prodotto cartesiano 554
Sottoinsiemi 553
Unione 554
TeraByte 550
Terza forma normale 545
TIMESTAMP 91
Tipi di dato SQL 88
tnsnames.ora 43
TO_CHAR 248
TO_DATE 249
TO_NUMBER 250
TO_TIMESTAMP 250
TOO_MANY_ROWS 341
Trace 459
Transazioni 298
TRANSLATE 234
Trigger 396
Trigger PL/SQL 78
TRIM 231; 364
TRUNC 236; 244
TRUNCATE 125
U
UNICODE 550
UNION 283
UNION ALL 286
unique key 71
Unix 548
UNPIVOT 198
UPDATE 139
UPPER 229
USER_SOURCE 418
utente 41
UTL_SMTP 434
V
Valori fissi 129
Valori Nulli 256
VALUE_ERROR 342
VARCHAR2 89
Variabili 317
VARIANCE 187
Varray 358
Virgola fissa 551
Virgola mobile 551
Viste 75
Viste materializzate 76
WHILE 325
Windows 548
WITH 297
WRAP 419
X
XML DB 79
XML Schema 508
XMLDATA 159; 473
XMLType 472
Z
W
ZERO_DIVIDE 342
WHERE 160
565
566
567