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