Utilizzo di Oracle 9i
A cura di:
Blasutto Emilia
Conic Slobodan
Lippi Stefano
Nonis Davide
Esame di Base di Dati
Prof. Carminelli
Anno accademico 2004-2005
Trieste, 10 ottobre 2005
Oracle 9i
Indice
1 Premessa
1.1
Scopo
1.2
Obbiettivi
2 Trattazione generale dei concetti
2.1
Modello Gerarchico
2.2
Modello Reticolare
2.3
Modello Relazionale
3
Database Relazionale
4 RDBMS Oracle
4.1
Oggetti
4.2
Kernel
4.3
Tool
4.4
Caratteristiche
4.5
Note di installazione
5
Linguaggio SQL
6 Oracle Spatial
6.1
Introduzione
6.2
Indici spaziali
6.3
Caratteristiche dei campi e degli oggetti SPATIAL
7
Il programma
8 Realizzazione dell’interfaccia
8.1
Installazione di Apache 2
8.2
Installazione PHP 5
8.3
Linguaggio PHP
8.4
Oracle Call Interface (OCI)
8.5
Funzioni di OCI utilizzate
8.6
Definizione delle funzioni usate nel progetto
8.7
Mansioni da espletare in veste di amministratore
8.8
Procedure di ripristino server in caso di riavvio o crash
8.9
Presentazione dell’interfaccia
8.10 Creazione dell’interfaccia
8.11 Utilizzo dell’interfaccia
9
Conclusioni
10 Obbiettivi Futuri
11 Bibliografia e riferimenti
12 Appendici
12.1 Figura Parco Naturale d’esempio
12.2 Codice SQL
12.3 Codice per la creazione della tabella iniziale
12.4 Codice SQL delle Query
12.5 Interpretazione Indice Spaziale
2
Base di Dati
Trieste, 10 ottobre 2005
Oracle 9i
3
Base di Dati
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
1 Premessa
1.1 Scopo:
Lo scopo dell’intero progetto è stato quello di realizzare un Database Oracle per l’applicazione delle
tecniche di ricerca R-tree e Q-tree sui dati immessi e una interfaccia grafica in PHP e HTML per rendere
user-friendly tutte le operazioni eseguibili sul database all’utente finale.
1.2 Obiettivi:

Affrontare e comprendere le problematiche durante l’installazione e configurazione di Oracle su
Windows OS.

Realizzazione di un Database tramite Oracle SQL Plus.

Creazione interfaccia grafica usando lingaggio PHP e HTML

Verifica del funzionamento degli indici Q-Tree ed R-Tree con delle queries tramite interfaccia
4
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
2 Trattazione generale dei concetti
Il progetto prevede inizialmente la realizzazione di un DB tramite il DBMS Oracle (DataBase Management
System), si procede quindi ad una definizione del database con i suoi vantaggi per poi passare alla
definizione e descrizione dell’Oracle che è un sistema basato sul concetto del database relazionale:
Definizione: “Un Database è una collezione organizzata di informazioni”.
I vantaggi dell’utilizzo di un Database sono i seguenti:

Il ritrovamento dei dati è veloce

I dati occupano meno spazio

I dati possono essere condivisi da più utenti

I dati ridondanti sono minori

L' inconsistenza dei dati può essere evitata

La sicurezza può essere controllata
Esistono diversi tipi di database:

Gerarchico

Reticolare

Relazionale
2.1
Modello Gerarchico
Nel modello gerarchico i dati sono organizzati in record connessi tra loro secondo strutture ad albero.
Ogni record del database, che non sia la radice dell'albero, deve avere uno e un solo padre. Possono
quindi esserci due record, su alberi diversi, che rappresentano la stessa informazione. Questo comporta
problemi di ridondanza nel database e richiede controlli di consistenza durante il suo uso. Inoltre non è
possibile memorizzare informazioni che non hanno padre. La struttura gerarchica impone delle regole
rigide sul modo di eseguire gli aggiornamenti e le interrogazioni: il livello più alto è il punto d’accesso a
tutte le informazioni.
La cancellazione di un record del database comporta l'eliminazione di tutti i record dipendenti
gerarchicamente da esso. L'aggiornamento di un dato richiede l'accesso e la modifica di diversi record per
assicurare la consistenza del database. Il modello gerarchico comporta la dipendenza dei programmi dalle
strutture, quindi non possiamo modificare le strutture senza modificare i programmi.
5
Trieste, 10 ottobre 2005
2.2
Oracle 9i
Base di Dati
Modello Reticolare
Nel modello reticolare i record sono legati tra loro con strutture ad anello (puntatori) che permettono
all'utente di accedere ai dati più facilmente, senza i vincoli rigidi della struttura gerarchica.
Ogni nodo può essere il punto di partenza per raggiungere un determinato campo. Un record può avere
uno o più record padre e ciò permette di evitare i problemi di ridondanza. Rimangono il problema della
dipendenza dei programmi dalle strutture e il problema della complessità delle strutture stesse che
crescono in proporzione alla crescita dei dati.
Per modificare, anche parzialmente, le strutture bisogna chiudere il DB e ricrearlo.
2.3
Modello Relazionale
Nel modello relazionale i dati sono organizzati in tabelle che rappresentano sia le entità, sia le relazioni
tra esse: esistono quindi tabelle di entità e tabelle di relazioni.
Nel modello relazionale, a differenza dei precedenti, non c' è alcun meccanismo esplicito per
rappresentare i legami logici tra i diversi tipi di record che non sia la relazione.
La modifica di un dato o di un legame comporta la manipolazione di un solo record di una tabella.
Nel modello relazionale, a differenza dei precedenti, si realizza l'indipendenza logica, è in pratica possibile
modificare le strutture senza dover modificare i programmi.
Si possono inoltre modificare le strutture a DB aperto, con gli utenti collegati.
6
Trieste, 10 ottobre 2005
3
Oracle 9i
Base di Dati
Database Relazionale
Un Database Relazionale è costituito da un insieme di tabelle che rappresentano ogni tipo di
informazione.
Per reperire i dati è sufficiente conoscerne la struttura logica e non è necessario conoscerne la locazione
fisica.
Una Tabella è un insieme di informazioni attinenti tra loro.

Una riga (o record) della tabella rappresenta un'entità.

Una colonna della tabella rappresenta un attributo di quell’ entità.
Nell' intersezione tra una riga e una colonna può esserci un solo valore, che può essere significativo o
nullo (NULL VALUE, diverso da zero e da blank). Non ci possono essere nomi di colonna duplicati.
L'ordine nel quale le righe sono contenute non ha importanza.
L'ordine nel quale le colonne sono contenute non ha importanza.
Affinché un RDBMS possa dirsi relazionale deve essere in grado di eseguire le tre operazioni relazionali di
base:

la proiezione, la selezione e il join.
In dettaglio:

La Proiezione è una visualizzazione "verticale" della tabella (solo alcune colonne).

La Selezione è una visualizzazione "orizzontale" della tabella (solo alcune righe che soddisfano
una condizione).

Il Join è l'unione di record che sono memorizzati su tabelle diverse.
Esistono diversi tipi di join: il prodotto cartesiano, il join naturale, il self join e
l'outer join.

Il Prodotto cartesiano di due tabelle T1 e T2 è un insieme con tutte le possibili coppie di
ogni record T1 con ogni record T2.

Il prodotto cartesiano completo non ha alcun interesse, occorre quindi selezionare da
questo le righe significative, cioè quelle in cui il campo in comune tra le tabelle in join ha
un contenuto uguale.Queste sono le condizioni di join che legano insieme due o più
tabelle in un Join naturale.

Il Self join è un join di una tabella con se stessa.

L' Outer join è un join tra due tabelle su una delle quali il record in join può mancare ma il
record dell’altra tabella viene visualizzato lo stesso.
7
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Tra le caratteristiche di un database relazionale vi è la possibilità di eseguire operazioni insiemistiche sulle
righe estratte da due o più tabelle: unione, intersezione e differenza.

L' Unione consiste nell'estrazione di tutte le righe che compaiono in almeno una delle tabelle.

L' Intersezione consiste nell'estrazione delle righe comuni a tutte le tabelle.

La Differenza consiste nell'estrazione delle righe che compaiono nella prima tabella ma non nella
seconda.
8
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
RDBMS Oracle (relational Data Base Management
4
System)
Oracle è un sistema complesso costituito da un software in grado di gestire un database relazionale in
conformità a richieste effettuate nel linguaggio SQL (Structured Query Language).
In altre parole Oracle è l’insieme dei seguenti componenti:

un database relazionale

un linguaggio SQL (un linguaggio di quarta generazione per l’accesso ai dati)

un insieme di programmi di gestione del database (il Kernel ed i Tool).
4.1 Oggetti
In un database Oracle, oltre alle tabelle, esistono altri tipi di oggetti:

L’ Indice un oggetto che ha una entry per ogni valore che appare nella colonna indicizzata della
tabella ed esegue un accesso rapido alle righe

il Cluster un insieme di tabelle che hanno una o più colonne in comune

il Rollback segment un segmento che memorizza i dati nella versione precedente la modifica

la Vista una "fotografia dinamica" di una particolare selezione da una o più tabelle

la Sequence un generatore di numeri progressivi

il Sinonimo la rinomina di un altro oggetto

lo Snapshot una copia in sola lettura di una una o più tabelle residenti su un database remoto,
rinfrescata periodicamente per riflettere lo stato attuale dei dati

la Procedure un insieme di comandi PL/SQL eseguibile dall' utente),

il Package un insieme di procedure salvato nel database

il Database link un collegamento ad un database remoto, Oracle o non Oracle
9
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
4.2 Kernel
Il Kernel è il motore del nostro sistema, è un software di notevoli dimensioni che svolge le seguenti
funzioni:

organizza la definizione e la memorizzazione dei dati

controlla e limita l'accesso ai dati

permette il backup e il recovery dei dati

interpreta i linguaggi SQL e PL/SQL
4.3 Tool
I Tool sono strumenti in grado di offrire vari servizi:

SQL*DBA è un’interfaccia che consente di eseguire le operazioni di amministrazione del database
(nelle versioni successive è utilizzato anche il server manager)

Export scarica in un file la definizione della struttura e i dati del database

Import carica nel database i dati letti da un file generato con Export

SQL*Loader carica nel database i dati letti da un file ASCI

SQL*Net consente la comunicazione, attraverso la rete, di database Oracle residenti su server e
applicazioni residenti su Client

SQL*Plus consente di eseguire statement SQL e blocchi PL/SQL, consente di formattare,
registrare e stampare il risultato delle query, consente di vedere le definizioni delle colonne di
ogni tabella

SQL*Forms consente lo sviluppo di applicazioni complesse, consente di programmare ad oggetti e
di usare il PL/SQL, consente la produzione rapida di maschere di default per la manipolazione dei
dati, consente la generazione di menu per il controllo e l'esecuzione di applicazioni

SQL*ReportWriter consente di generare report complessi

Precompilers consentono di inserire statement SQL all' interno di programmi scritti in linguaggi di
terza generazione
10
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
4.4 Caratteristiche
Le caratteristiche fondamentali di Oracle sono le seguenti:

Compatibilità nei confronti dello standard SQL

Portabilità sulla quasi totalità delle piattaforme

Connettibilità: capacità di accedere a dati presenti su macchine diverse integrando fonti di dati
Oracle e non Oracle

Multiutenza: la possibilità, da parte di più utenti, di condividere i dati.
A proposito di connettibilità due concetti sono essenziali:
Processing distribuito: un'applicazione lavora su un nodo di una rete detto client ma accede a un
database che risiede su un nodo diverso detto server. Il kernel di Oracle è installato sul nodo che
possiede il database. Molte applicazioni si collegano allo stesso database. La gestione del database è
separata dall'esecuzione delle applicazioni.
Database distribuito: un insieme di database fisici visti come un unico database logico. L'utente non
deve sapere dove risiedono fisicamente i dati (location transparency). Ogni database fisico resta
comunque autonomo rispetto agli altri (site autonomy).

ORACLE Server è dotato del meccanismo di Two-phase Commit. Tale meccanismo consente
l'esecuzione di operazioni di manipolazione che coinvolgono due o più database residenti su nodi
diversi della rete (transazione distribuita).

Oracle garantisce un efficiente supporto della multiutenza e cioè la possibilità, da parte di più
utenti, di condividere i dati con la sicurezza della consistenza in lettura ottenuta senza sacrificare
le qualità delle performance. Il lock a livello di riga consente l'aggiornamento concorrente di
record diversi della stessa tabella da parte di processi utente differenti.
La consistenza in lettura permette di leggere i dati in uno stato immutato per tutta la durata della
lettura stessa, nonostante le operazioni di modifica che possono aver luogo su quei dati.
La sicurezza dei dati è garantita dalla creazione di utenti Oracle con precisi privilegi, ruoli e profili.
Oracle consente di far uso di strumenti di ottimizzazione in grado di migliorare le performance. È
possibile una vera e propria metodologia di tuning che miri ad ottimizzare tanto gli statement SQL quanto
il consumo da parte di Oracle di risorse di sistema (memoria, i/o).
Per l'ottimizzazione degli statement SQL assume importanza il Query Optimizer, un modulo del kernel al
quale spetta il compito di decidere il piano di esecuzione di uno statement. ORACLE permette di scegliere
tra un approccio Rule based (basato su regole sintattiche) ed un approccio Cost based (basato sulla
valutazione dei costi di accesso ai dati valutati basandosi sulla dimensione delle tabelle e la selettività
delle condizioni).
11
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Il database Oracle possiede al suo interno il cosiddetto dizionario dati generato al momento della
creazione del database. È formato da una serie di tabelle e viste di sistema (proprietà dell'utente SYS) a
disposizione degli utenti per la consultazione di tutte le informazioni necessarie per una completa e
corretta gestione del database. La tabella che descrive tutto il dizionario dati si chiama DICTIONARY.
ORACLE server supporta sia l'integrità dichiarativa che l'integrità procedurale.

L'integrità dichiarativa consiste nel controllare l'integrità dei dati senza scrivere a questo scopo
programmi, ma definendo direttamente nello statement di creazione della tabella dei vincoli (i
constraint) che vengono processati in caso di inserimento, cancellazione o modifica dei dati.

L'integrità procedurale si realizza invece tramite comandi PL/SQL memorizzati sotto forma di
trigger di database associati alle tabelle. Essi scattano compiendo un'operazione o un controllo
ogni volta che le tabelle in questione vengono modificate.
12
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
4.5 Note di installazione:
Per poter eseguire l’installazione di Oracle 9i è necessario avere un PC dotato di Windows Xp professional
aggiornato con la SP1 (Service Pack 1). Tentare di installare Oracle su macchine dotate della versione
Home Editinon di Windows XP può provocare problemi in fase di installazione ma soprattutto di
utilizzo.L’installazione avviene tramite uno Wizard che guida l’utente passo per passo nella definizione dei
parametri quali la cartella di installazione, la definizione dei prodotti da installare, la configurazione del
database iniziale che viene formato durante la procedura e altre proprietà.
Abbiamo optato per l’installazione del pacchetto ‘standard edition’, questa comporta l’installazione di circa
3 GB di dati sull’hard Disk. Al termine dell’installazione abbiamo riscontrato che 3GB installati hanno per
motivi sconosciuti cominciato ad essere sempre maggiori, finché le applicazioni in sottofondo dell’Oracle
non hanno riempito il rimanente spazio sull’HD (15GB!). A questo punto era impossibile lavorare con il
sistema perché in sovraccarico!
Si è deciso quindi di disinstallare il prodotto e ritentare l’installazione. Si è notato a questo punto che la
procedura di disinstallazione pur essendo stata completata in maniera regolare, aveva rimosso gran parte
dei componenti Oracle, ma non tutti. Le parte rimanenti sono state tolte dall’utente una per una. Svariate
componenti risultavano però nascoste all’utente o impossibili da eliminare quindi dopo vari tentativi senza
successo siamo stati costretti ad eseguire una procedura di formattazione del disco rigido con perdita
completa delle informazioni dell’utente. Si è quindi dovuto reinstallare dapprima la versione completa di
Windows XP Professional Editino e successivamente 9i con file sorgenti scaricati nuovamente dalla rete.
Il sistema risultava operativo e non dava problemi di ‘overflow del HD’, però questo rallentava il Sistema
Oprativo in quanto l’oracle dedicava perennemente alle sue applicazioni 150mb di Ram e 20% di utilizzo
del processore!
La causa del problema riscontrato nella prima installazione l’abbiamo associata al fatto che i file sorgenti
con tutta probabilità fossero difettosi o corrotti!
13
Trieste, 10 ottobre 2005
5
Oracle 9i
Base di Dati
Linguaggio SQL
Il linguaggio SQL (Structured Query Language, linguaggio strutturato per le interrogazioni) è l’insieme dei
comandi che possono essere usati per accedere ai database relazionali, come ad esempio Oracle, il
database più diffuso su macchine Unix. L’ANSI (American National Standard Institute) ha adottato l’SQL
come il linguaggio standard per i database relazionali e, anche per questo motivo, è diffuso in tutte le
industrie, le università e le aziende di ogni parte del mondo.
I maggiori benefici risultanti dall’utilizzo del linguaggio SQL sono:

L’SQL è un linguaggio ad alto livello: l' utente specifica cosa vuole ottenere, il sistema si
preoccupa di come ottenerlo.

L’SQL può elaborare più elementi insieme anziché uno alla volta.

Può essere usato da tutti i livelli di utente, a partire dall’amministratore di sistema per arrivare
all’utente finale; è potente ma i suoi comandi principali possono essere imparati in poche ore.

Il linguaggio permette di eseguire diverse istruzioni come l’inserimento, la modifica, la
cancellazione e la selezione dei dati, la creazione, la modifica e l’eliminazione di oggetti quali
tabelle, viste, indici, utenti e così via. Una prerogativa importante dell’SQL consiste nel
comprendere tutti i comandi nello stesso linguaggio, anziché ricorrere a più linguaggi diversi.

L’SQL è un linguaggio estremamente portabile: una applicazione scritta per un DB basato su un
suo "dialetto" SQL può essere portata senza nessuna o, al più, poche modifiche, in un altro
database basato sull’SQL.
Il linguaggio SQL opera su una serie di oggetti che fanno parte del database. Tra questi i principali sono
tabelle, indici, viste, ...
Le tabelle Oracle sono i principali oggetti per la gestione dei dati. Ciascuna tabella è formata da una o più
colonne. Naturalmente il tipo di dato presente nelle colonne è un tipo di dato supportato da Oracle.
I comandi SQL possono essere classificati in 3 grosse categorie:

DML - Data Manipulation Language, linguaggio di manipolazione dei dati.

DDL - Data Definition Language, linguaggio di definizione dei dati.

DCL - Data Control Language, linguaggio di controllo dei dati.
14
Trieste, 10 ottobre 2005
6
ORACLE SPATIAL
6.1
Introduzione
Oracle 9i
Base di Dati
Usando Oracle, gli attributi di una tabella possono essere associati, oltre ai tipi di dato tradizionali, a dei
tipi di dato spaziale come punti, linee o poligoni.
Come linguaggio di programmazione si usa l’SQL+, il quale, nelle ultime versioni, si è evoluto,
permettendo le interrogazioni basate su criteri spaziali, oltre a quelle con criteri alfanumerici. Le selezioni
sono basate su spatial relationship rispetto a valori geometrici costanti o query interattive.
L’estensione SPATIAL permette di memorizzare dati spaziali supportando il modello object-relational per
la gestione.
6.2
Indici spaziali
Al fine di gestire queste voci del database, oltre ai classici indici, rivestono un ruolo fondamentale gli
indici spaziali. Ma a cosa servono effettivamente? Per poter trovare le informazioni quando si fa
un’interrogazione, Oracle setaccia tutte le colonne della tabella fino a quando non incontra quella giusta;
per eseguire quest’operazione più velocemente e per “alleggerire” la ricerca, si fa in modo di dare delle
specifiche tramite delle sentence WHERE, le quali limitano il campo d’azione ed indirizzano il programma
ad una risposta più breve.
Nel nostro caso, la ricerca va fatta come se si lavorasse su una tavolozza da disegno in cui bisogna
riconoscere dei punti. Si introduce quindi una distinzione tra due tipi di indici:

Quad-tree(space driven)

R-tree(data driven)
La struttura Quad-tree si basa sulla decomposizione ricorsiva dello spazio in celle/quadranti
(decomposition): fissato un numero massimo di elementi contenuti in un quadrante, ogni volta che si
verifica un overflow, il quadrante interessato viene suddiviso in quattro quadranti. In poche parole lo
spazio di ricerca viene ricorsivamente decomposto in quadranti,fino a quando il numero di rettangoli che
intersecano ciascun quadrante è inferiore alla risoluzione (che è stata definita dall’utente) della pagina.
Un indice R-tree approssima ogni geometria memorizzata come il minimo numero di rettangoli che riesce
a contenere. Scegliamo quest’ultimi fondamentalmente perché sono più veloci e facili da generare, inoltre
non necessitano di sintassi particolari o di contenuti aggiuntivi.
15
Trieste, 10 ottobre 2005
6.3
Oracle 9i
Base di Dati
Caratteristiche dei campi e degli oggetti SPATIAL
Innanzitutto si possono utilizzare diversi tipi di coordinate tipo:

Geodetiche

Proiettate

Locali
ma di default vengono assunte quelle CARTESIANE.
Lo spatial usa uno speciale oggetto chiamato SDO_GEOMETRY, il quale è
definito come:
CREATE TYPE SDO_GEOMETRY AS OBJECT (
SDO_GTYPE NUMBER,
SDO_SRID NUMBER,
SDO_POINT SDO_POINT_TYPE,
SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY,
SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY);
La SDO_GEOMETRY è solo un altro tipo di dato per le colonne come INTEGER or VARCHAR2.
CREATE TABLE STATES (
PID
INTEGER PRIMARY KEY,
POP NUMBER(9),
GEOM
MDSYS.SDO_GEOMETRY);
SDO_GTYPE Indica la geometria ed è composto da 4 cifre nel formato dllt.

“d”
indica il numero di dimensioni

“l”
identifica la misura di riferimento lineare per una geometria 3-dimensionale

“LRS” (linear referencing system)

“tt”
identifica il tipo geometrico
16
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
quindi:








d000
d001
d002
d003
d004
d005
d006
d007
UNKNOWN_GEOMETRY
POINT
LINESTRING
POLYGON
COLLECTION
MULTIPOINT
MULTILINESTRING
MULTIPOLYGON
SDO_RID
Può essere usato per identificare un sistema di coordinate associate alla geometria, se è null si assume il
sistema di default.
SDO_POINT
Identifica i punti per una variabile GeoMedia (in coordinate geodetiche), quindi nel nostro caso è null.
SDO_ELEM_INFO
È un vettore di lunghezza variabile di triplette che permette di interpretare le coordinate memorizzate in
SDO_ORDINATES.
SDO_STARTING_OFFSET
Indica l’offset all’interno del vettore sdo_ordinates dove è memorizzata la prima coordinata(>=1).
SDO_ETYPE
Indica il tipo dell’elemento che può essere semplice o composto.
SDO_INTERPRETATION
Se SDO_ETYPE indica un elemento semplice,determina l’interpretazione della sequenza,altrimenti
specifica quante sono le triplette successive.
SDO_ORDINATES
È un vettore di lunghezza variabile di oggetti di tipo number in cui vengono memorizzate le coordinate
che definiscono la frontiera di un valore geometrico.
Per una migliore comprensione vedere Appendice
Le interrogazioni (query) su questi tipi di oggetti possono essere molteplici, a
partire da distanze reciproche, per arrivare ad intersezioni ed aree.
17
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
7 Il programma
Per semplificare la comprensione del tutto si è voluta immaginare la gestione di un parco naturale, dove
ogni specie animale ha un suo raggio d’azione (cioè una zona) in cui vive.
Le aree a questo punto sono state modellizzate con diverse figure (cerchi, rettangoli, ecc...) ed inserite in
una tabella da noi definita natural_park.
Ad ogni record della tabella natural park (cioè ad ogni specie), sono state attribuite delle caratteristiche
come il numero di elementi, il nome, il tipo di animale (predatore o no) e shape che descrive la forma
dell’area appartenente ad ogni specie animale.
Il primo passo quindi è la definizione della tabella natural park utilizzando il seguente codice SQL (sotto
riportato e commentato):
CREATE TABLE natural_park (
num_of_elements VARCHAR(10), name VARCHAR(20),
-
predator VARCHAR(1),
-
shape MDSYS.SDO_GEOMETRY);
-
Definizione tabella natural park
Specifica il campo “num of elements” di tipo variable
testo di al massimo 10 caratteri
Specifica il campo “name” di tipo variabile testo di al
massimo 20 caratteri
Specifica il campo “predator” con una variabile testo
di un solo carattere (y/n)
usa la funzione SDO_Geometry per definire la forma
dell’area
Il risultato è la seguente tabella, composta da quattro colonne (campi) ed n righe (records)
Natural Park
Numero Elementi
num_of_elements
VARCHAR(10)
Nome
name
VARCHAR(20)
Tipologia
predator
VARCHAR(1)
18
Forma
shape
MDSYS.SDO_GEOMETRY
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Una volta creata la tabella, è necessario definire la sua area complessiva e la precisione della griglia (nel
nostro caso un quadrato largo 30 unità e alto 30 unità con una precisione di 0.005 unità)
INSERT INTO USER_SDO_GEOM_METADATA VALUES(
-
Definizione tabella natural park
'natural_park',
-
Specifica il nome della tabella di cui
definiamo l’area
Richiama il nome del campo nel quale
verrà creato l’oggetto
Specifica la dimensione e la risoluzione
della griglia in X
Specifica la dimensione e la risoluzione
della griglia in Y
'shape',
-
MDSYS.SDO_DIM_ARRAY(
-
MDSYS.SDO_DIM_ELEMENT('X',0,30,0.005),
-
MDSYS.SDO_DIM_ELEMENT('Y',0,30,0.005)),
NULL);
Poi creiamo l’indice spaziale R-tree:
CREATE INDEX natural_park_idx ON natural_park(shape)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;
--per esempio mettendo PARAMETERS('SDO_LEVEL=8') faccio un quadtree
Procediamo poi con un esempio in SQL per l’inserimento di una specie, in questo caso “cerbiatto”
(record), con le sue caratteristiche, all’interno della tabella natural park, gli altri record usati nel nostro
esempio sono riportati in appendice 1.2
INSERT INTO natural_park VALUES(
-
35,
-
'cerbiatto',
'n',
MDSYS.SDO_GEOMETRY(
-
2003,
NULL,
NULL,MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),
MDSYS.SDO_ORDINATE_ARRAY(0,0, 15,5) ));
19
Comando per inserire nella ns tabella i
valori riportati tra parentesi
Definisce il numero di elementi (35)
Definisce il nome dell’area (cerbiatto)
Definisce se predatore o no (no)
Definizione dello Shape dell’area (in questo
caso si tratta di un forma rettangolare con
estremi di coordinate A=(0,0) e B=(15,5) )
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Come ultimo vediamo l’esempio della sintassi di un’interrogazione
(query)significativa:
Nella query sottostante ed in tutte le query d’esempio riportate nell’appendice 1.4 vengono utilizzate
delle aree specifiche, ma è chiaro che per poter effettuare questi test sulle altre zone, è sufficiente
sostituire nelle righe di comando che definiscono con WHERE il campo d’azione (qui evidenziato in rosso),
il nome della specie interessata.
DETERMINARE L’AREA DI UNA ZONA:
-
SELECT a.name,
SDO_GEOM.SDO_AREA(a.shape,0.005)
-
FROM natural_park a
-
WHERE a.name = 'cerbiatto';
-
Dà il valore alla variabile “a” del campo
“name” della tabella natural_park
Specifica che deve calcolare l’area tramite
l’oggetto SDO_GEOM
Determina che il campo “name” si trova
nella tabella “natural_park”
Specifica il nome del campo di cui ci
interessa l’area (“cerbiatto”)
Tutte queste righe di programma possono essere viste da Oracle senza dover
passare per il worksheet dell’ SQLPLUS (il che implicherebbe un compilatore
java per la traduzione delle istruzioni).
Nella nostra relazione abbiamo optato su due diverse procedure di creazione della
Tabella.

La prima metodologia di creazione è anche quella più complicata, infatti prevedere che
tramite “command window” di Windows (cmd.exe) si digiti “sqlplus”, che permette il
collegamento al nostro database tramite l’inserimento della UserName (system) e della
Password (manager). Quindi, una volta collegati, si compone manualmente il codice
spiegato precedentemente come se si lavorasse con una schermata dos. Per completare
l’operazione sarebbe necessario scrivere a mano tutto il codice visto nel capitolo 7 “Il
Programma” e il codice in appendice 1.2 mentre nell’appendice 1.3 è esposto tutto il
codice necessario, alla creazione manuale della tabella iniziale di “Natural Park”
20
Trieste, 10 ottobre 2005

Oracle 9i
Base di Dati
La seconda strada invece prevede l’utilizzo dell’interfaccia utente che prevede la
creazione automatica della tabella iniziale tramite la pressione di un Tasto con il Mouse
(spiegazione nel prossimo capitolo)
Una veste grafica più User Friendly è sicuramente auspicabile ma questo richiederebbe l’uso di
un’applicazione per la creazione della GUI per Oracle che è fornita con il pacchetto di Oracle Forms a
pagamento e non è invece presente nella versione liberamente scaricabile. Pertanto si è deciso di
realizzare l’interfaccia tramite il linguaggio <html> ed <php> che sono OpenSource. La spiegazione
dell’interfaccia è spiegata nel capitolo successivo.
21
Trieste, 10 ottobre 2005
8
Oracle 9i
Base di Dati
Realizzazione dell’interfaccia
Ci si è posto il problema di realizzare un’interfaccia grafica che permetta all’utente di eseguire delle
operazioni di modifica ed interrogazione sul DataBase realizzato nella procedura di installazione di Oracle
e che abbiamo chiamato “Tesina”.
Per la realizzazione di un’interfaccia dinamica ed interattiva abbiamo optato sull’utilizzo del linguaggio
‘PHP’ in quanto presenta, per la gestione di Database, delle caratteristiche indispensabili che sono
dettagliatamente trattate in un capitolo successivo.
Per prima cosa ci siamo dovuti munire di tutti gli strumenti software:
1) Oracle Entrerprise Edition: suite completa per la realizzazione di DataBase.
2) Server Apache: Web Server
3) PHP 5: per la realizzazione dell’interfaccia e l’interpretazione del codice
4) Internet Explorer 5 ( o successivo): Web Browser per la visualizzazione e interazione da parte
dell’utente finale (solitamente questo strumento viene fornito con il sistema operativo Windows)
Nelle prossime pagine (come da schema logico qua sotto riportato) verranno illustrate le procedure di
installazione e configurazione di questi strumenti aggiuntivi all’Oracle, la spiegazione del codice PHP e la
definizione delle funzioni che verranno utilizzate per descrivere poi l’interfaccia vera e propria.
Installazione e configurazione:

Come installare Apache 2

Come installare PHP 5
Approfondimenti:

Linguaggio PHP

Libreria ‘oracle call interface’

Descrizione Funzioni

Mansioni dovute all’amministratore dell’oracle server

Guida all’uso dell’interfaccia
22
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Iniziamo quindi con spiegare la procedure di configurazione degli strumenti:
8.1 Installazione di Apache 2
Anche se Windows 2000 ed alcune versioni di Windows XP posseggono al loro interno un web server
(Internet Information Services o più brevemente IIS) è preferibile, nello sviluppo di applicazioni PHP,
l'utilizzo del server Apache. Infatti Apache non è solo un valido web server ed in molte situazioni
superiore ad IIS, ma è anche il web server che più comunemente ci verrà messo a disposizione dai
fornitori di servizi di hosting.
L'installazione di Apache 2 è molto semplice, per prima cosa dobbiamo scaricare dal sito ufficiale il file di
installazione denominato "Win32 Binary (MSI Installer)" (link: http://httpd.apache.org/download.cgi). Nel
momento in cui scriviamo, il nome del file associato è apache_2.0.52-win32-x86-no_ssl.msi
Effettuato il download lanciamo l'installer che ci presenterà la seguente schermata:
23
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Dopo aver premuto il tasto Next ci verrà chiesto di accettare la licenza:
Accettata la licenza ci verranno mostrate altre informazioni sul software che andiamo ad installare:
Procedendo con l'installazione ci verrà chiesto di fornire alcune informazioni circa il dominio di rete, il
nome del server ed un indirizzo email dell'amministratore. Poiché stiamo configurando un server di
sviluppo, possiamo rispondere in maniera fantasiosa, senza compromettere il risultato finale.
24
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
La prossima schermata ci chiederà di indicare il tipo di installazione che intendiamo fare: optiamo per una
installazione tipica.
Adesso ci viene data la possibilità di scegliere in quale cartella installare Apache. Accettiamo quella che ci
viene proposta di default.
25
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Prima di procedere con la vera e propria installazione di Apache ci viene data un ultima possibilità di
tornare indietro per effettuare eventuali modifiche alla configurazione:
Procediamo pure premendo il tasto Install.
26
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Dopo poche decine di secondi l'installazione sarà conclusa e ci verrà proposta la seguente schermata:
A conferma della corretta installazione, una nuova icona nel “system tray” ci informa dello stato del
server Apache. Una freccia verde indica che Apache è in esecuzione sulla nostra macchina.
27
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Per avere un'ulteriore prova del corretto funzionamento di Apache, apriamo il web browser Internet
Explorer e digitiamo il seguente indirizzo: http://localhost/.
Se tutto è andato bene ci verrà mostrata la seguente pagina.
28
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
8.2 Installare PHP 5
L'installazione di PHP 5 e la sua integrazione in Apache spesso risultano ostiche ai novizi. In realtà la
procedura da seguire è abbastanza semplice e richiede solo un po' di attenzione.
Procuriamoci il pacchetto compresso di PHP 5 scaricandolo da questa pagina:
http://www.php.net/downloads.php.
E' molto importante non scaricare l'installer di PHP 5 poiché questo non contiene quelle estensioni che
permettono, tra le altre decine di funzionalità, di connetterci a database ORACLE. Scegliamo quindi il
file indicato con il nome PHP 5.0.4 zip package (o una versione più recente se disponibile). Dopo averlo
scaricato, creiamo la cartella C:\php e scompattiamo al suo interno il contenuto del pacchetto zippato di
PHP 5. Cerchiamo il file di nome php5ts.dll nella cartella C:\php e spostiamolo nella cartella di
Windows C:\windows.
Adesso dobbiamo integrare il PHP 5 all'interno di Apache. Per prima cosa apriamo la cartella nella quale
abbiamo installato Apache, nel nostro caso C:\Programmi\Apache Group\Apache2 e cerchiamo al
suo interno la cartella conf. In questa cartella è presente il file httpd.conf ovvero il principale file di
configurazione di Apache. Apriamolo con un editor di testo (il blocco note va benissimo) ed andiamo ad
individuare al suo interno un lungo elenco di righe che iniziano con la parola LoadModule. Portiamoci alla
fine di questo elenco ed aggiungiamo le seguenti righe e salviamo i cambiamenti.
LoadModule php5_module "c:/php/php5apache2.dll"
AddType application/x-httpd-php .php
PHPIniDir "C:/php"
Ecco il risultato ottenuto usando il blocco note:
Dobbiamo tornare nella cartella C:\php e rinominare il file php.ini-dist in php.ini che costituisce il file
di configurazione di PHP.
Come ultima operazione è necessario modificare il file php.ini, lo apriamo con il Blocco note a andiamo
ad aggiungere la seguente riga di codice all’interno di esso:
extension_dir = "c:\PHP\ext"
29
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Successivamente andiamo a togliere il ‘punto-virgola’ davanti alla voce “extension=php_oci8.dll” per
liberare la libreria ‘Oracle Call Interface’ che utilizzeremo e spiegheremo nella creazione di pagine PHP
d’interfaccia al DB ORACLE.
La riga da aggiungere; posizionarla
dopo la voce:
‘extension_dir directive above.’
Cancellare il simbolo del ‘punto-virgola’
davanti alla riga:
‘extension=php_oci8.dll’
30
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Per rendere effettive le modifiche fatte alla configurazione di Apache dobbiamo riavviarlo. Clicchiamo
quindi due volte sull'icona di Apache presente nel “system tray” (l'icona a forma di piuma rossa con una
freccia verde all'interno), ci apparirà la seguente schermata:
Per riavviare Apache sarà sufficiente cliccare sul pulsante Restart. La procedura dura pochi secondi, se
non vengono visualizzati errori significa che tutto è andato a buon fine. Per sincerarcene realizziamo un
piccolo script PHP. Apriamo il blocco note e scriviamo le seguenti istruzioni:
<?php
phpinfo();
?>
Otterremo qualcosa di simile:
Salviamo il file appena creato nella cartella htdocs (la nostra cartella ‘root’ (principale) di Apache; nel
nostro caso il suo percorso è C:\Programmi\Apache Group\Apache2\htdocs) impostando il nome a
info.php.
31
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Per evitare che il blocco note automaticamente aggiunga l'estensione .txt è possibile salvare il file
scrivendo il nome tra virgolette, ovvero nel campo Nome file della finestra Salva con nome
scrivere "info.php". Adesso proviamo a lanciare il nostro piccolo script appena realizzato: apriamo il
browser e digitiamo il seguente indirizzo: http://localhost/info.php Se tutto è stato eseguito
correttamente otterremo la seguente pagina:
32
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
8.3 Linguaggio PHP
Il PHP (Personal Home Page tools) é un linguaggio di scripting creato nel 1994 da Rasmus Lerdorf, oggi
PHP è conosciuto come ‘Hypertext Preprocessor’ appositamente disegnato per la generazione dinamica di
pagine web. Il PHP é un linguaggio server-side, ovvero gira sul server web mentre il client (il browser del
visitatore del sito) ne vede soltanto il risultato finale, ovvero il documento HTML. Questa premessa é
d'obbligo in quanto molti potrebbero confondere il codice PHP con del codice JavaScript che, nonostante
le molte similitudini, sono due linguaggi completamente diversi. Il PHP può funzionare in due modalità:
come CGI, in questo caso viene compilato come un eseguibile stand-alone che può essere utilizzato da
qualsiasi server web; oppure come modulo di apache. Quest'ultimo caso presenta due vantaggi rispetto
alla modalità CGI: maggiore velocità e minor spreco di memoria.
Come funziona il PHP
Ogni volta che un browser (Internet Explorer, Netscape o altro) richiede al server web un documento la
cui estensione termina con .html, il server web legge dal proprio filesystem il file corrispondente e lo
ritorna al browser senza apportare nessuna alterazione. Invece, quando viene richiesto un documento
che termina con .php, .php3 oppure .phtml, il server web filtra il file letto dal filesystem attraverso
l'interprete PHP prima di ritornare l'output al cliente. La differenza, ed i vantaggi, tra una pagina PHP ed
uno script CGI é per gli esperti palese: mentre uno script CGI deve gestire a basso livello tutti i messaggi
del protocollo HTTP e mandare in output tutto il testo del documenti HTML, questo lavoro viene effettuato
in maniera trasparente al programmatore da parte dell'interprete PHP. Quest'ultimo lascia il
programmatore libero di includere le parti dinamiche della pagina direttamente all'interno del documento
HTML, aumentando notevolmente la velocità con cui è possibile sviluppare un sito web.
La prima cosa da sapere è come fa PHP (inteso come interprete) a riconoscere il codice php contenuto nel
file che sta analizzando. Il codice php infatti deve essere compreso fra appositi tag di apertura e di
chiusura, che sono i seguenti:
<?php //tag di apertura
?> //tag di chiusura
Tutto ciò che è contenuto fra questi tag deve corrispondere alle regole sintattiche del PHP, ed è codice
che sarà eseguito dall'interprete e non sarà inviato al browser.
33
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Perché scegliere PHP?
I motivi sono più di uno, e non è facile stabilire quale sia quello principale. Tuttavia, è sicuramente molto
importante il fatto che si tratta di un prodotto open source e gratuito, quindi a disposizione di tutti. E'
importante notare che il vantaggio garantito dall'Open Source non è limitato al non dover sborsare
denaro ma si estende oltre: infatti tutti i progetti open source molto seguiti generano delle vaste
comunità di utenti alle quali si può fare riferimento per trovare facilmente una soluzione ai propri
problemi
La portabilità è un altro fattore determinante: PHP può girare su moltissime piattaforme, sia per quanto
riguarda i sistemi operativi che i server web. Il suo "habitat naturale" è un server Apache su una
macchina Linux, ma può girare tranquillamente anche su IIS o perfino su un modesto Windows 98 con
Personal Web Server. Questa sua capacità di adattarsi a qualsiasi "ambiente" gli dà un grosso vantaggio
su quella che attualmente si può considerare la sua maggior rivale, cioè la tecnologia ASP (ora .NET) di
Microsoft, che è limitata ai sistemi operativi della casa di Redmond.
Anche per quanto riguarda le prestazioni PHP non rimane certo indietro: il motore Zend, introdotto con
PHP 4, ha fornito un formidabile aumento della velocità di esecuzione, portando PHP sugli stessi livelli di
ASP, ed in alcuni casi anche oltre.
PHP è anche facile da imparare: la sua sintassi deriva dal C, e quindi sarà familiare a chi è già
programmatore ed arriva da questo genere di linguaggi. Allo stesso tempo, però, PHP risulta facilmente
digeribile anche da chi è a digiuno di informatica, grazie ad alcune sue caratteristiche di flessibilità come
la non obbligatorietà della dichiarazione delle variabili, il trattamento automatico dei diversi tipi di dati, la
gestione della memoria. Tutto questo può consentire praticamente a chiunque di iniziare ad usare PHP in
poche ore.
Nonostante la sua semplicità, PHP è però un linguaggio dalle potenzialità vastissime: le sue funzioni
infatti partono dalle più tradizionali operazioni di programmazione (calcoli, gestione delle stringhe, degli
array ecc.) e ci permettono di realizzare le più svariate funzioni legate al mondo del web: elaborare i
moduli html, gestire i cookies, mantenere traccia del dialogo con un utente, creare immagini, manipolare
documenti pdf, collegarci e leggere i file da un altro sito internet, e tante altre ancora che è impossibile
elencare.
Ce n'è però una che è la più importante, e sicuramente una delle più utilizzate: la possibilità di
connettersi ai database. PHP è in grado di interagire con una vasta quantità di database server,
permettendoci con pochi comandi di leggere e scrivere i dati su di essi, e di realizzare così quella
meraviglia che è il Web dinamico. Anche in fatto di database abbiamo un'ampia scelta, e possiamo
andare dai più costosi, come Oracle, a quelli gratuiti e open source come PostgreSql e MySql.
34
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Quest'ultimo, in particolare, forma con PHP un binomio ormai pressoché inscindibile, di gran lunga il più
diffuso nell'"era moderna" di Internet.
35
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
8.4 Oracle Call Interface
Oracle Call Interface (OCI) rappresenta un interfaccia per la gestione e interrogazione dei database
realizzati in Oracle utilizzando il linguaggio PHP, quest’interfaccia viene utilizzata tramite una serie di
funzioni studiate appositamente. Le funzioni dell’OCI per essere usate bisogna che venga inclusa
l’estensione di libreria “php_oci8.dll” la quale contiene tutte le suddette funzioni per l’oracle.
Questo file è reperibile direttamente nella cartella “c:\php\ext”, cioè la cartella che abbiamo creato
nell’installazione del PHP 5. Come descritto sopra per includere questa libreria nel linguaggio PHP, e
quindi usufruire delle funzioni dell’OCI, è necessario modificare il file php.ini.
Dunque queste funzioni permettono di accedere ai database Oracle9, Oracle8 e Oracle7, usando la Oracle
Call Interface (OCI). Questa estensione è più flessibile della estensione precedente di Oracle. Supporta il
binding di variabili PHP locali e globali ai segnaposto Oracle, ha pieno supporto di LOB, FILE e ROWID e
permette di utilizzare variabili di definizione personalizzabili.
8.5 Funzioni dell’OCI utilizzate
Le funzioni che compongono la OCI sono tante e permettono di poter lavorare sui database Oracle in
maniera totale e completa quasi senza alcuna limitazione. E’ da notare che le funzioni sono fatte per
poter lavorare su “Client Side” e su “Server Side”, quindi si possono gestire le multiutenze ormai
indispensabili e quasi tutte le operazioni concesse solamente all’amministratore Oracle oltre a permettere
interrogazioni ad utenti che non hanno privilegi da amministratore e utenti con varie limitazioni che
possono venire definite dall’amministratore.
Non è possibile ottenere tutto con queste funzioni ed è per questo che, anche nel nostro progetto, la
funzione dell’amministratore di Oracle Server è necessaria ed indispensabile. Le sue operazioni si
effettuano direttamente su Oracle e le Interfacce del pacchetto enterprise. Le operazioni da svolgere
necessariamente come utente “amministratore” per la messa in funzione del nostro database sono
dettagliatamente descritte e spiegate successivamente.
36
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
8.6 Passiamo adesso alle definizioni di funzioni che abbiamo utilizzato
nel nostro progetto:
Come già detto queste funzioni vengono inserite tra i tag “<?” e“?>” per poter essere correttamente
interpretate dal PHP.

Funzione OCILogon (“nome utente”,”password utente”, “nome database”)
Questa funzione permette di connetterci al nostro database. Si scrive quindi direttamente nome utente,
password oppure queste due voci possono essere richiamate da delle variabili che quindi possono
contenere già i dati oppure essere inseriti direttamente dall’utente tramite un’interfaccia.
Questa funzione però ha lo svantaggio di concludere il suo ciclo di lavoro con la chiusura del “tag di
chiusura” “?>”, il che risulta inutile e gravoso nel caso (come il nostro) in cui l’utente è uno solo con
privilegi di amministratore.
La funzione OCILogon() restituisce un identificatore di connessione necessario per la maggior parte delle
altre chiamate OCI. Il terzo parametro opzionale può contenere il nome della istanza Oracle locale o il
nome della voce in tnsnames.ora a cui ci si vuole connettere. Se il terzo parametro opzionale non è
specificato, PHP usa la variabile d'ambiente ORACLE_SID (istanza di Oracle) o TWO_TASK (in
tnsnames.ora) per determinare a quale database collegarsi.
Bisogna dire che esiste la possibilità di gestione della multiutenza tramite altre funzioni, ma per il nostro
progetto questa possibilità non veniva richiesta e quindi per la gestione di un singolo utente (SOLO
amministratore) abbiamo deciso di scrivere il nome utente e password (system,manager) del database
direttamente nella funzione.

Funzione OCIParse (“variabile di connessione”,”interrogazione al DB”)
Questa funzione ha il compito di verificare se ‘l’interrogazione al DB’ è valida nel confronti della
connessione che si è effettuato tramite una ‘variabile di connessione’ che ovviamente contiene la funzione
OCILogon ()
Restituisce un identificatore di istruzione se la ‘interrogazione’ o ‘query’ è valida, FALSE altrimenti. La
query può essere un qualsiasi comando SQL o blocco di codice PL/SQL

Funzione OCIExecute (variabile di esecuzione, [int mode])
Questa funzione esegue un comando e/o query precedentemente analizzato. (vedere OCIParse()). Il
parametro opzionale mode permette di specificare la modalità di esecuzione (di default è
OCI_COMMIT_ON_SUCCESS).
Se non si desidera che i comandi eseguano un commit automatico, usare OCI_DEFAULT nella variabile
mode.
Restituisce TRUE in caso di successo, FALSE in caso di fallimento.
37
Trieste, 10 ottobre 2005

Oracle 9i
Base di Dati
Funzionie OCIFetchStatement ( “variabile di connessione”, “variabile per l’array”)
La funzione OCIFetchStatement ha il compito di estrarre tutte le tuple in un array che l’utente deve
definire. Essa restituisce il numero di tuple estratte. E’ quindi necessario usare un'altra funzione del PHP:
‘print’ per richiamare i Tag caratteristici dell’HTML per la creazione delle tabelle

Funzione $HTTP_XXX_VARS[“nome variabile”]
Il compito di questa funzione è quello di estrarre da una pagina di estensione .html i valori che assumono
gli oggetti di un ‘form’ dopo un inserimento di dati da parte dell’utente. Da sottolineare il fatto che la
funzione è operativa solamente su pagine con l’estensione .html. Si ricorda che nella compilazione di un
‘form’ ad ogni oggetto (campo di testo, pulsante, etc) è possibile attribuire un nome. Per esempio si
realizza l’oggetto campo di testo che assume il nome “oracle”:
<input type="text" name="oracle">
L’oggetto in questione ha dunque assunto il nome ‘oracle’ e quindi nella nostra seconda pagina, che varrà
richiamata dal form stesso, ci sarà la nostra funzione che dovrà assumere la seguente forma:
$HTTP_XXX_VARS[“oracle”]  a questo punto abbiamo ottenuto il valore dell’oggetto ‘oracle’
La parte centrale della funzione “XXX” assume la scrittura “POST” oppure “GET” a seconda del metodo di
invio che si preferisce utilizzare nel ‘form’. Per maggiori chiarimenti si riporta l’attenzione del lettore al
seguente link: http://www.html.it nel quale si può comprendere con più dettaglio l’uso dei ‘form’
Nel progetto si è fatto uso della modalità di invio “POST”, pertanto nei successivi richiami della funzione
verrà usata la scrittura $HTTP_POST_VARS[“nome variabile”] e non si farà più riferimento alla forma
generale.

Istruzione Print “testo”
Ricordiamo che la funzione ‘print’ è una funzione che fa parte della libreria principale del PHP e non fa
parte della ‘php-oci8.dll’; come anche le seguenti istruzioni. La sua sintassi è la seguente: Print “quello
che si vuol far leggere al browser”; dunque risulta intuitivo che tra le virgolette è sufficiente scrivere
dei <tag> dell’Html per ottenere qualunque visualizzazione sul nostro Browser. Si sottolinea che tra le
virgolette del commando Print è possibilie scrivere anche semplicemente del testo al solo fine di
visualizzarlo dal Browser

Istruzione IF (condizione) { istruzioni } else { istruzioni}
L’istruzione IF ha lo stesso comportamento di quello che assume nel resto dei linguaggi di
programmazion. Nel php la sintassi è diversa ed è quindi necessario scrivere tra le parentesi () la
condizione perché le istruzioni che di norma vengono messe tra due parentesi ‘graffe’ vengano eseguite.
Se la condizione non viene soddisfatta allora automaticamente vengono eseguite le istruzioni che sono
contenute nelle parentesi dell’istruzione ELSE
Si sottolinea che le parentesi graffe non sono indispensabili, ma per una miglior visione e ordine nella
programmazione sono sicuramente di grande aiuto
38
Trieste, 10 ottobre 2005

Oracle 9i
Base di Dati
Istruzione While (condizione) {istruzioni}
L’istruzione While fa si che finché la condizione viene rispettata si eseguano le istruzioni contenute tra le
parentesi per un ciclo di volte specificato dalla condizione.
Anche in questo caso si fa notare che le parentesi graffe sono messe per una visualizzazione e stesura del
codice da ‘buon programmatore’

Istruzione For (variabile uguale a tot; variabile inferiore a tot; incremento della
variabile) {istruzioni}
Questa istruzione utilizza la parola chiave 'for', seguita, fra parentesi, dalle istruzioni per definire il ciclo;
di seguito, si racchiudono fra parentesi graffe tutte le istruzioni che devono essere eseguite
ripetutamente. Le tre istruzioni inserite fra le parentesi tonde vengono trattate in questo modo: la prima
viene eseguita una sola volta, all'inizio del ciclo; la terza viene eseguita alla fine di ogni iterazione del
ciclo; la seconda deve essere una condizione, e viene valutata prima di ogni iterazione del ciclo: quando
risulta falsa, l'esecuzione del ciclo viene interrotta, ed il controllo passa alle istruzioni dopo le parentesi
graffe. Quando invece è vera, le istruzioni fra parentesi graffe vengono eseguite. Ovviamente è possibile
che tale condizione risulti falsa fin dal primo test: in questo caso, le istruzioni contenute fra le parentesi
graffe non saranno eseguite nemmeno una volta.
Il formato standard è quindi quello che è definito nell’intestazione, che utilizza le parentesi tonde per
definire un 'contatore': con la prima istruzione lo si inizializza, con la seconda lo si confronta con un
valore limite oltre il quale il ciclo deve terminare, con la terza lo si incrementa dopo ogni esecuzione.
Con il ciclo 'for', così come con tutti gli altri cicli, è molto importante stare attenti a non creare una
situazione in cui il ciclo non raggiunge mai una via d'uscita (il cosiddetto 'infinite loop'): in questo caso,
infatti, lo script rieseguirebbe il nostro ciclo all'infinito.

Istruzione echo “testo”
L’istruzione echo ha il comportamento e la sintassi del tutto analoga all’istruzione precedentemente
analizzata del PRINT “testo”
39
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
8.7 Mansioni da espletare in veste di amministratore dell’Oracle server
Prima di passare alla spiegazione del funzionamento dell’interfaccia che gestisce la tabella è necessario
illustrare la procedura necessaria per poter accedere al Database tramite GUI.
E’ importante sottolineare che il software Oracle è un applicazione con caratteristiche “server oriented”,
cioè esso è ideato per venire installato sui server da dove garantisce funzioni e accessi agli utenti che
vogliono connettersi e accedere ai vari database. Poiché è noto che solitamente i server sono calcolatori
con prestazioni elevate e che sono accesi sempre, si può intuire che esistono delle operazioni di ripristino
del server se questo viene spento o entra in condizione di guasto.
Infatti, anche l’Oracle richiede delle procedure di ripristino in caso di riavvio del calcolatore (server) sul
quale è installato perché possa essere sempre operativo e disponibile all’uso.
E’ da notare che le procedure sopranominate e qua sotto descritte sono da eseguire ‘una tantum’ cioè la
sola volta in cui viene riavviato il server.
Nella nostra situazione in cui si disponeva di un calcolatore che fungeva da Personal Computer per uso
domestico e non da Server le procedure si dovevano eseguire ad ogni riavvio del PC.
8.8 Le procedure da eseguire in caso di riavvio del server sul quale è
installato l’Oracle sono :

Aprire il DBA studio come indicato nella figura sottostante
40
Trieste, 10 ottobre 2005

Oracle 9i
Base di Dati
Dopo aver premuto sulla voce ‘DBA Studio’ vi si apre una finestra di dialogo sulla quale e
sufficiente premere ok

Qualche attimo dopo comparirà la finestra generale del DBA Studio nella quale comparirà a
sinistra il nome del database creato all’atto dell’installazione; nel nostro progetto il database si chiama
“TESINA”. Bisogna premere sul simbolo del “+” accanto al nome del DB e automaticamente si aprirà la
finestra di dialogo nella quale bisogna inserire la username e la password di amministratore del database
41
Trieste, 10 ottobre 2005

Oracle 9i
Base di Dati
Inserire il ‘Nome utente’ e la ‘password’ negli appositi campi e selezionare di connettersi al
database come “SYSDBA”, cioè come amministratore del sistema. Il vantaggio di questa procedura è che
si ottengono privilegi da amministratore con la possibilità di poter ripristinare il Database

Il risultato che si ottiene è che la ‘cartella’ TESINA si espande e ci fa vedere il suo contenuto, a
questo punto è necessario espandere la ‘catella’ ‘Instance’ e premere sul database… Ci appare a
destra della finestra generale un ‘semaforo’ selezionare la voce ‘Open’ e premere su ‘Apply’
2)
Premere il tasto “Apply”
dopo aver selezionato
l’opzione “open” per
l’apertura del database
1)
premere sul simbolo del “+”
accanto alla voce Instance e
successivamente premere
sulla Voce ‘Database’
3)
Questa e la finestra di dialogo che ci
avvisa che la procedura del
ripristino del Database è in opera
42
Trieste, 10 ottobre 2005

Oracle 9i
Base di Dati
L’ultima schermata che ci appare è la seguente e ci dice che il ripristino del database è avvenuta
con successo, premere allora su ‘Close’
Dopo aver eseguito queste procedure il nostro database è stato ripristinato ed è pronto all’uso e quindi
d’ora in poi tutte le procedure di modifica e di interrogazione tramite la nostra interfaccia diventano
possibili.
43
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
8.9 Presentazione dell’interfaccia
Si è voluta realizzare un’interfaccia che sia semplice ma allo stesso tempo funzionale e completa con tutti
gli strumenti necessari alla modifica e interrogazione del database realizzato al momento dell’installazione
del pacchetto Oracle Enterprise Edition. Questa è stata realizzata usando un connubio tra le pagine con
l’estensione .html e pagine con l’estensione .php. Si è usato questo metodo per poter ottenere tramite i
<tag> del linguaggio <html> un impaginazione ed aspetto gradevole, mentre tramite i tag “<?” e “?>”
l’efficacia delle azioni usando il codice PHP. Si è optato per questa soluzione anche per quanto messo in
luce nella definizione delle funzioni utilizzate, cioè la possibilità di utilizzare la funzione
$HTTP_POST_VARS[“nome variabile”] e quindi rendere l’interfaccia dinamica e interattiva.
Infatti si sono realizzate varie pagine ciascuna contenente un ‘form’ di compilazione dei dati e si sono
tutte salvate con l’estensione .html, i quali valori ottenuti tramite l’inserimento da parte dell’utente
devono essere ripresi da un codice PHP per dare il risultato alle varie interrogazioni e/o modifiche che
l’interfaccia permette di effettuare. Come si voleva dimostrare questa fu quasi una scelta obbligata, in
quanto avendo optato per l’utilizzo della funzione $HTTP_POST_VARS[“nome variabile”] era necessario
salvare i documenti con questa estensione per caratteristiche specificate nella definizione della funzione
stessa.
Tutte le pagine sono state realizzate tramite l’editor di testo fornito dal S.O. Windows il ‘Blocco Note’ ed è
quindi possibile visualizzare il codice che sta alla base di ogni pagina semplicemente ciccando con il tasto
destro del mouse per poi selezionare sul menù a scomparsa la voce HTML.
E’ un’operazione che si consiglia di effettuare per un corretto approfondimento e analisi della
realizzazione delle pagine stesse che compongono l’interfaccia.
8.10 Creazione dell’interfaccia
Finora si è parlato dell’interfaccia senza aver la possibilità di visualizzare il lavoro svolto e confrontarlo
con le descrizioni fatte.
Per poter finalmente cominciare a navigare nell’interfaccia è necessario scompattare il contenuto del file
“Sito_tesina.rar” nella cartella “C:\Programmi\Apache Group\Apache2\htdocs\oracle”.
Bisogna notare che la cartella “C:\Programmi\Apache Group\Apache2\htdocs” è la cartella ‘root’
(principale) del nostro server Apache, cioè digitando nella barra degli indirizzi dell’IE “http://localhost” si
otterrebbe il contenuto della cartella ‘root’.
Si evidenzia il fatto che la cartella ‘root’ può essere cambiata a piacimento dell’utente agendo sul file di
configurazione httpd.conf che si trova nella cartella “C:\Programmi\Apache Group\Apache2\conf\”
44
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Quindi quello che bisogna fare è creare una nuova cartella “oracle” e in questa scompattare il contenuto
del file “sito_tesina.rar”. Il contenuto è rappresentato da tutte le pagine che compongono la nostra
interfaccia.
Per iniziare a navigare bisogna digitare nella barra degli indirizzi dell’IE la seguente frase
“http://localhost/oracle”
Precedentemente si era parlato dell’installazione e della configurazione del server Apache, il quale oltre
alle proprietà che si sono evidenziate presenta un’altra caratteristica peculiare per la realizzazione della
nostro interfaccia. Infatti come si nota non bisogna specificare il nome di nessuna pagina iniziale per
poter iniziare a navigare, si è tenuto conto di una delle tante proprietà dell’Apache che automaticamente
va a cercare i file che iniziano con la parola “index” e che presentano un estensione di tipo .html o .htm ,
etc. Notare che se si fosse creato un file index.php questo non verrebbe caricato automaticamente perché
non fa parte del gruppo di estensioni che si attribuiscono alle pagine Html.
Tenendo opportunamente conto di questa caratteristica del server Apache si è semplificato all’utente
l’apertura dell’interfaccia al semplice inserimento del nome della cartella che contiene la nostra
interfaccia; un po’ come si fa di solito nella navigazione in internet, dove non bisogna scrivere
manualmente il nome della pagina principale ma solamente l’indirizzo!
45
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
8.11 Utilizzo dell’interfaccia
Come già detto, per visualizzare l’interfaccia bisogna digitare nella barra di indirizzi dell’IE la seguente
frase:“http://localhost/oracle” il risultato che si ottiene è rappresentato dall’immagine seguente:
L’interfaccia è stata realizzata in maniera tale da mantenere sempre a disposizione dell’utente la
possibilità di accedere alle opzioni proposte. Infatti è stato creato un ‘frame’ a sinistra della finestra che
contiene tutti i collegamenti a pagine che servono all’utente per aggiungere, interrogare ed eliminare voci
del database “Tesina”. Questo ‘frame’ è sempre visualizzabile durante ogni operazione e permette
pertanto velocità e facilità nell’accesso a varie viste da parte dell’utente.
L’interfaccia contiene oltre al ‘frame’ a sinistra anche un ‘frame’ nella parte superiore della finestra.
Questo ‘frame’ ha il compito di visualizzare il logo di Oracle il quale se cliccato apre la pagina del sito
ufficiale dell’oracle (www.oracle.com), il nome degli autori ed il ‘link’ alla “pagina iniziale”.
46
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
La “pagina iniziale” è la pagina che si può osservare nella figura con lo sfondo di colore blu. Si è realizzata
questa pagina per permettere all’utente di scegliere le varie opzioni tramite la pressione sul tasto
corrispondente e quindi avere una seconda via per accedere alla visualizzazione delle pagine che
contengono i sopraccitati ‘form’ di compilazione, che sono indispensabili all’utente per interagire col
dataBase.
Ogni pagina che contiene i ‘form’ di compilazione ha in se la guida alla compilazione dello stesso ed
inoltre presenta due tasti che hanno sovrimpresso “Inserisci” o “Interroga” o “indietro”.
I tasti con suscritto “Inserisci” o “Interroga” eseguono l’operazione di ‘submit’ del ‘form’ e richiamano
una pagina dall’estensione .php che utilizza i parametri inseriti precedentemente mentre i tasti “indietro”
fanno tornare di un passo indietro la navigazione dell’utente.
Per rendere ancora più amichevole l’interfaccia si sono realizzati, nelle pagine dinamiche scritte in
linguaggio PHP, dei controlli di errore, infatti se l’utente digita in uno dei form il nome errato di un record,
le suddette pagine avvisano l’utente che non è stato possibile trovare il record richiesto e di verificare la
scrittura.
NOTA BENE:
La prima operazione da effettuare con l’interfaccia è di premere sul LINK nel FRAME di sinistra
“CREA LA TABELLA INIZIALE”; così si ottiene la creazione automatica della nostra tabella
iniziale ‘natural_park’. Questa procedura si è deciso di implementarla con lo scopo di facilitare
all’utente anche l’operazione che è proprietaria dell’amministratore del server Oracle. E’ da
notare bene che quest’operazione va eseguita solo la prima volta o nel caso in cui la tabella
non esista per poi non doverla richiamare successivamente.
Quindi con un click si crea la tabella iniziale composta da 7 record ognuno con una forma
geometrica preassegnata (il codice utilizzato è riportato nell’appendice 1.2); l’oracle segnalerà
due avvisi che sono dovuti alla velocità di esecuzione e non perché l’operazione non è
avvenuta con successo; pertanto vengono ignorati! (premere successivamente sul tasto
‘indietro’  vedere figura sottostante)
Per vedere la configurazione delle aree della tabella iniziale si prema sul link “apri la foto
iniziale della disposizione delle aree”; così si apre un nuova pagina dell’IE che visualizza la
foto in .jpg!
47
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Si consiglia all’utente prima di effettuare modifiche, aggiunte ed eliminazioni nel database di interrogarlo
preventivamente agendo con l’opzione “vedi tutto” (raggiungibile sia dal ‘frame’ di sinistra sia dalla
‘pagina iniziale’) per ottenere l’elenco completo degli elementi contenuti nel database “tesina” e in special
modo i nomi dei ‘record’ presenti nella tabella “natural_park” così da poter visualizzare i nomi corretti da
riprendere nella compilazione successiva delle query.
48
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
9 Conclusioni
Nonostante le iniziali difficoltà di installazione, probabilmente dovute a file sorgente corrotti, l'Oracle
risulta semplice nell'installazione e nella configurazione del DB iniziale, grazie all'interfaccia che guida
passo dopo passo l'utente nella definizione dei parametri.
Si nota che l'interfaccia utente è particolarmente comprensibile e permette una rapida creazione e
successiva elaborazione di elementi del DB; offre inoltre la possibilità di sistemare i parametri principali,
la possibilità di agire su configurazioni complesse tramite comandi avanzati.
Oracle può essere utilizzato per la realizzazione di piccoli database per aziende di piccole e medie
dimensioni o per realizzare DB distribuiti (DDB) su più macchine connesse in rete Lan o Wan.
Come noto però la gestione di un DB non è banale e richiede sicuramente una conoscenza avanzata dei
server e delle architetture dei DDB ed una oculata esperienza sul campo.
In definitiva coniugando al meglio quell'indipendenza dai sistemi proprietari che è punto di forza della
tecnologia Java, Oracle scardina i presupposti fondamentali delle consuete archittetture client/server,
offrendo applicazioni facili da mantere e controllabili dal centro ma non per questo meno efficienti e
produttive, promettendo inoltre, dal lato client, una connettività quanto più possibile aperta: dalle grandi
WorkStation ai palmari, dai PC alle JavaStation. E' una soluzione affidabile, efficiente, evoluta ed in
continuo aggiornamento, non sostituisce certo gli strumenti di analisi dati, ma li integra e li amplia con
un solido supporto di archiviazione e gestione.
E' sicuramente la suite di piattaforma applicativa più completa ed integrata oggi disponibile sul mercato.
La realizzazione dell’interfaccia è risultata difficoltosa in quanto non abbiamo avuto conoscenze
preliminari del linguaggio PHP di alcun genere. Sorpassate le iniziali difficoltà della compressione della
logica del funzionamento del linguaggio PHP abbiamo riscontrato difficoltà nell’uso della OCI il cui
apprendimento non è stato banale in quanto la documentazione a riguardo è di difficile reperibilità e di
scarsa comprensione. Il conseguimento del risultato finale è stato frutto di un lavoro di un mese e mezzo
di tentativi e prove. Nel periodo di stesura del codice dell’interfaccia ci siamo accorti che il passaggio da
una pagina PHP ad un'altra PHP ( come per esempio nel passaggio dalla pagina in cui si inseriscono voci
per un’interrogazione alla pagina che esegue la stessa) non era così facilmente eseguibile a differenza di
quanto scritto nei tutorial esposti in “bibliografia” nel capitolo successivo. Quindi il continuo messaggio di
errore che compariva quando si tentava di far interagire due pagine PHP ci ha spinti a cercare altre
metodologie di ‘interattività’ delle pagine. Difatti abbiamo optato per l’utilizzo della funzione
$HTTP_XXX_VARS[“var”] che è stata spiegata precedentemente e che ci ha permesso di trovare la
soluzione al problema semplicemente utilizzando un’interazione tra pagine Html e Php. Da ciò si evince
che le pagine Php svolgono il compito di ‘interattività’ cioè eseguono i comandi inviati dall’utente tramite
le pagine in Html per l’interrogazione del nostro Database “tesina” realizzato con l’Oracle.
49
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
10 Obiettivi futuri
Il progetto realizzato rappresenta un’ottima base per uno sviluppo personalizzato e/o professionale di
varie esigenze che possono servire nella gestione di uno o più database realizzati in Oracle.
Il nostro progetto è stato realizzato sotto l’ipotesi di un singolo utente che assume le caratteristiche di
amministratore; tramite le funzioni OCI esiste la possibilità di gestire più utenti e più database tramite
una sola interfaccia (precedentemente si è dato un accenno di questa possibilità) pertanto uno studio più
approfondito della libreria OCI è indispensabile se si ha l’esigenza di una Multiutenza. E’ da notare che
esiste la possibilità di gestione di multi-utenti e di creazione delle protezioni anche tramite l’uso del
Server Apache; pertanto si richiama l’attenzione dell’utente alla bibliografia del server Apache e in special
modo sui file .access
Una caratteristica molto importante che si è messa in luce grazie a questo progetto è stata quella dell’uso
dei oggetti di tipo SDO_GEOM che come spiegato in uno dei capitoli precedenti permettono di definire per
ogni record della tabella un’area con una qualsiasi geometria e di effettuare tantissime interrogazioni su
questa/e area/e. Gli esempi di interrogazione tramite l’oggetto SDO_GEOM sono riportati in appendice
1.4.
Gli usi di questo oggetto sono innumerevoli, basti pensare per esempio alla planimetria di una città, la
geometria delle infrastrutture, individuazione di aree topografiche specifiche in una determina zona, etc.
Grazie alle sue proprietà sarebbe possibile realizzare un database con la sua relativa interfaccia
contenente tutte queste informazioni.
Si potrebbe addirittura ipotizzare di creare un sistema cartografico per la navigazione GPS, con per
esempio un database di punti d’interesse memorizzati, o aggiunti dall’utente
Sicuramente il problema che si pone a questo punto è la possibilità di visualizzare graficamente l’area
complessiva realizzata usando l’oggetto SDO_GEOM per una migliore interpretazione e comprensione.
Infatti nella nostra interfaccia abbiamo messo in luce la possibilità di visualizzare l’area complessiva
tramite la visione di una foto in .jpg che abbiamo preventivamente realizzato con un CAD utilizzando le
coordinate impiegate nella realizzazione delle aree iniziali della tabella iniziale.
Il procedimento che abbiamo utilizzato non è automatico e prevede quindi un lavoro separato con un
qualunque software di disegno, noi l’abbiamo fatto solo per rendere inizialmente visibili le aree della
tabella iniziale e per permettere all’utente di capire come vengono sistemate le aree create; ma
l’aggiornamento di questa immagine, magari dopo un nuovo inserimento o una cancellazione, non è stato
realizzato.
Tuttavia può essere necessario avere la possibilità di ottenere l’immagine delle aree in maniera
automatica e immediata. Per realizzare questa applicazione è necessario far interagire l’oggetto
SDO_GEOM o con un software di grafica realizzato in linguaggio C o con un software di CAD o GIS o
usare applicazioni specifiche acquistabili in rete.
Secondo noi la line da seguire per ottenere un applicazione che realizzi l’immagine voluta è quella di
avvalersi del seguente sito:
50
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
http://modules.geotools.org/oraclespatial/apidocs/org/geotools/data/oracle/sdo/SDO.html nel quale è
spiegato il modo con il quale si potrebbe ottenere l’elenco delle coordinate utilizzate dallo stesso oggetto
necessarie per delimitare le aree.
Una volta ottenute queste coordinate sarebbe necessario l’interazione con un software di grafica per la
visualizzazione su schermo dell’area totale. Si consiglia di creare un software ex-nuovo in linguaggio C.
La seconda via è quella che descrive la possibilità di visualizzare l’area totale anche tramite l’acquisto di
un software specifico del quale si evidenziano due link per la guida all’uso:
1)
http://www.agocg.ac.uk/wshop/sosci/workshop.pdf
 vedere solo pagina 22
2)
http://www.avs.com/index_wf.html  in special modo consultare “AVS EXPRESS”
Sarebbe poi possibile effettuare un’altra operazione: supponiamo di avere una immagine raffigurante una
planimetria, o una cartografia, sarebbe possibile tramite dei programmi di CAD o GIS (alcuni anche Open
Source), effettuare una Georeferenzazione, ossia digitalizzare la mappa cartografica, segnando i punti di
interesse, questi poi potrebbero essere esportati in un semplice file di testo o XML e importati nella
tabella Oracle.. questa ovviamente è solo una bozza di idea per l’uso di questi strumenti di cui il nostro
progetto si compone.
51
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
11 Bibliografia e riferimenti
E’ possibile scaricare il pacchetto di Oracle 9i gratuitamente da l sito
http://www.oracle.com/technology/software/index.html
Per ottenere i file è necessario innanzitutto registrarsi nel sito e richiedere una licenza student (gratuita)
Nel pacchetto software liberamente scaricabile non è incluso Oracle Forms, il programma che permette
di realizzare l’interfaccia grafica da associare a un programma scritto in SQL per Oracle.

I riferimenti per quel che riguarda Oracle Spatial sono:
http://www.gdal.org/ogr/drv_oci.html
http://www.safe.com/reader_writerPDF/oracle.pdf
http://www.geo.unizh.ch/oai/spatialdb/sdoapi/examples/

I riferimenti per il codice SQL sono:
http://www.functionx.com/sql/Lesson01.htm
http://www.functionx.com/sql/Lesson02.htm
http://www.1keydata.com/sql/sql.htm

I riferimenti per il codice PHP sono:
http://php.morva.net/manual/it/
http://www.php.net/
http://www.html.it/
http://freephp.html.it/
http://www.latoserver.it/php/pi-acca-pi.php3
52
Trieste, 10 ottobre 2005
Oracle 9i
12 Appendici
Appendice 1.1
Figura raffigurante il Parco naturale con le singole aree
53
Base di Dati
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Appendice 1.2
Codice SQL per l’inserimento delle aree come specificate nell’immagine in appendice 1.1
INSERT INTO natural_park VALUES(
14,
'volpe',
'y',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),
---rettangolo
MDSYS.SDO_ORDINATE_ARRAY(0,5, 30,15)
---due punti per definire il rettangolo
)
);
INSERT INTO natural_park VALUES(
15,
'castoro',
'n',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),
---rettangolo
MDSYS.SDO_ORDINATE_ARRAY(20,7, 25,12)
---due punti per definire il rettangolo
)
);
INSERT INTO natural_park VALUES(
4,
'orso',
'y',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,4),
---cerchio
MDSYS.SDO_ORDINATE_ARRAY(15,3, 27,15, 15,27)
---tre punti
)
);
54
Trieste, 10 ottobre 2005
Oracle 9i
INSERT INTO natural_park VALUES(
72,
'lepre',
'n',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1005,2, 1,2,1, 5,2,2),
---poligono
MDSYS.SDO_ORDINATE_ARRAY(5,15, 10,1, 10,15, 10,20, 5,15)
)
);
INSERT INTO natural_park VALUES(
34,
'marmotta',
'n',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,4),
---cerchio
MDSYS.SDO_ORDINATE_ARRAY(25,20, 30,25, 25,30)
---tre punti
)
);
INSERT INTO natural_park VALUES(
140,
'trota',
'n',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),
---rettangolo
MDSYS.SDO_ORDINATE_ARRAY(0,7, 30,10)
---due punti per definire il rettangolo
)
);
55
Base di Dati
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Appendice 1.3
Codice necessario per la creazione della tabella iniziale tramite l’inserimento manuale:
1)
Passo




aprire il Command Window (premere starteseguicmd ; invio per
confermare)
scrivere nella schermata dos “SQLPLUS”
Digitare lo UserName; che nel nostro database è “SYSTEM”
Digitare la Password; che nel nostro database è “manager”
Passo
2)

Digitare manualmente o tramite “copia/incolla” il seguente codice in ordine:
CREATE TABLE natural_park (
id_num NUMBER,
num_of_elements VARCHAR(10),
name VARCHAR(20),
predator VARCHAR(1),
shape MDSYS.SDO_GEOMETRY);
CREATE TYPE SDO_GEOMETRY AS OBJECT (
SDO_GTYPE NUMBER,
SDO_SRID NUMBER,
SDO_POINT SDO_POINT_TYPE,
SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY,
SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY);INSERT INTO
USER_SDO_GEOM_METADATA VALUES(
'natural_park',
'shape',
MDSYS.SDO_DIM_ARRAY(
MDSYS.SDO_DIM_ELEMENT('X',0,30,0.005),
MDSYS.SDO_DIM_ELEMENT('Y',0,30,0.005)),
NULL);
56
Trieste, 10 ottobre 2005

Oracle 9i
Poi creiamo l’indice spaziale R-tree:
CREATE INDEX natural_park_idx ON natural_park(shape)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;
--per esempio mettendo PARAMETERS('SDO_LEVEL=8') faccio un quadtree
INSERT INTO natural_park VALUES(
1,
35,
'cerbiatto',
'n',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),
---rettangolo
MDSYS.SDO_ORDINATE_ARRAY(0,0, 15,5)
---due punti per definire il rettangolo
)
);
INSERT INTO natural_park VALUES(
14,
'volpe',
'y',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),
---rettangolo
MDSYS.SDO_ORDINATE_ARRAY(0,5, 30,15)
---due punti per definire il rettangolo
)
);
INSERT INTO natural_park VALUES(
15,
'castoro',
'n',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),
---rettangolo
MDSYS.SDO_ORDINATE_ARRAY(20,7, 25,12)
---due punti per definire il rettangolo
)
);
57
Base di Dati
Trieste, 10 ottobre 2005
Oracle 9i
INSERT INTO natural_park VALUES(
4,
'orso',
'y',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,4),
---cerchio
MDSYS.SDO_ORDINATE_ARRAY(15,3, 27,15, 15,27)
---tre punti
)
);
INSERT INTO natural_park VALUES(
72,
'lepre',
'n',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1005,2, 1,2,1, 5,2,2),
---poligono
MDSYS.SDO_ORDINATE_ARRAY(5,15, 10,1, 10,15, 10,20, 5,15)
)
);
INSERT INTO natural_park VALUES(
34,
'marmotta',
'n',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,4),
---cerchio
MDSYS.SDO_ORDINATE_ARRAY(25,20, 30,25, 25,30)
---tre punti
)
);
INSERT INTO natural_park VALUES(
140,
'trota',
'n',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),
---rettangolo
MDSYS.SDO_ORDINATE_ARRAY(0,7, 30,10)
---due punti per definire il rettangolo
58
Base di Dati
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Appendice 1.4
Codice SQL per varie interrogazioni delle aree:
1
DETERMINARE L'INTERSEZIONE TOPOLOGICA DI DUE AREE
SELECT SDO_GEOM.SDO_INTERSECTION(a.shape,b.shape,0.005)
FROM natural_park a,natural_park b
WHERE a.name='cerbiatto' AND b.name='lepre';
2
DETERMINARE L'AREA GLOBALE
SELECT name,
SDO_GEOM.SDO_AREA(shape,0.005)
FROM natural_park;
3
DISTANZA FRA LE 2 ZONE
SELECT SDO_GEOM.SDO_DISTANCE(a.shape,b.shape,0.005)
FROM natural_park a,natural_park b
WHERE a.name='marmotta' AND b.name='castoro';
4
DETERMINARE LE ZONE A DISTANZA INFERIORE DI TOT DALLA ZONA X
SELECT a.name
FROM natural_park x,natural_park a
WHERE x.name='castoro' AND a.name<>'castoro' AND
SDO_WITHIN_DISTANCE(a.shape,x.shape,'distance=3')='TRUE';
5
ZONE CHE INTERSECANO LA ZONA X
SELECT a.name
FROM natural_park x,natural_park a
WHERE x.name='castoro' AND
SDO_RELATE(a.shape,x.shape,'mask=overlapbdyintersect querytype=window')='TRUE';
59
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Appendice 1.5
Di seguito riportiamo un approfondimento per capire meglio il significato della riga di codice
MDSYS.SDO_ELEM_INFO_ARRAY(X,XXXX,X)
Il vettore SDO_ELEM_INFO è composto da SDO_STARTING_OFFSET,
SDO_ETYPE e SDO_INTERPRETATION, separati da una virgola.
SDO_STARTING_OFFSET
Indica l’offset all’interno del vettore sdo_ordinates dove è memorizzata la prima coordinata(>=1).
SDO_ETYPE
Indica il tipo dell’elemento che può essere semplice o composto.
SDO_INTERPRETATION
Se SDO_ETYPE indica un elemento semplice,determina l’interpretazione della sequenza,altrimenti
specifica quante sono le triplette successive.
Nella tabella riportata si trova tutta l’interpretazione dei dati riportati in ogni figura con
MDSYS.SDO_ELEM_INFO_ARRAY(X,XXXX,X)
SDO_ETYPE
SDO_INTERPRETATION
0
qualsiasi
1
1
Tipo punto
1
n>1
Gruppo di n punti
2
1
2
2
1003 o 2003
1
Poligono semplice i cui vertici
sono connessi da segmenti di
linee rette
1003 o 2003
2
Poligono formato da una
sequenza connessa di archi
circolari
1003 o 2003
3
Tipo rettangolo: solo due punti
(basso a sinistra e alto a destra)
1003 o 2003
4
Tipo cerchio: tre punti tutti
appartenenti alla circonferenza
4
n>1
Stringa di linee composte: n indica
il numero di triplette successive, le
successive n triplette descrivono
ogni sottoelemento
1005 o 2005
n>1
Poligono composto: n indica il
numero di triplette successive, le
successive n triplette descrivono
ogni sottoelemento
SIGNIFICATO
Modella tipi geometrici non supportati da Oracle
Spatial numerico
Stringa di linee i cui vertici sono
connessi da segmenti di linee
rette
Stringa di linee formata da una
sequenza di archi circolari
60
Trieste, 10 ottobre 2005
Oracle 9i
Base di Dati
Riportiamo un esempio per una migliore comprensione…ricopiando l’inserimento di una
semplice area circolare all’interno della tabella Natural Park
INSERT INTO natural_park VALUES(
34,
'marmotta',
'n',
MDSYS.SDO_GEOMETRY(
2003,
NULL,
NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,4),
---cerchio
MDSYS.SDO_ORDINATE_ARRAY(25,20, 30,25, 25,30)
---tre punti
)
);
Qui all’interno dell’array troviamo tre numeri 1 – 1003 – 4
Il primo 1 è come spiegato sopra l’offset
Il 1003 con il 4 accanto indica “Tipo cerchio definito tramite 3 punti tutti appartenenti alla
circonferenza”
Poteva anche essere definito con la stringa 1 – 2003 – 4 senza alcuna differenza…
E in effetti qui l’area “marmotta era proprio un’area circolare.
61