Perchè utilizzare SQL solo su tabelle? Si può fare molto di più...

Posted by Alessia, Roberta, Saverio ed Antonella | Posted in , , | Posted on 16:18

Abbiamo già visto come accedere a dati LDAP come se fossero tabelle.

Ma la stessa cosa si può fare con file di testo, documenti XML o fogli di calcolo.


Come si fa?

Prima di tutto occorre che Oracle sia in grado di leggere il file; per ottenere ciò, occorre che il file sia all'interno del Server che ospita il DBMS (improbabile) o che sia accedibile mediante URI (molto più semplice).

Le istruzioni seguenti consentono di ottenere il contenuto del file come campo Lob (Character Lob in questo caso), oppure come documento XML.

select UriFactory.getUri('http://localhost/mioFile.xml').getXML() from dual
select UriFactory.getUri('http://localhost/mioFile.html').getClob() from dual

Ovviamente questo è solo il primo passo.
Noi vogliamo una vera tabella, con righe e colonne....

Documenti XML

Con i documenti XML è tutto molto semplice...basta utilizzare XQuery.

select t. from
XMLTable('//rows' PASSING UriFactory.getUri('http://localhost/mioFile.xml').getXML()
COLUMNS data_in date PATH '/rows/@data',
id integer PATH '/rows/@id', url varchar2(1000) PATH '/rows/@url') t

Altri file di testo

Il modo più semplice è quello che prevede l'utilizzo delle external tables.
Le external tables di Oracle sono delle istruzioni che permettono di definire la struttura di un file in modo che Oracle sia in grado di leggerne i dati come se fossero all'interno del DB. Ovviamente le prestazioni sono un po' diverse...

Un paio di esempi:

create table txt_table (txt_line varchar2(2000))
 organization external
 (type ORACLE_LOADER default directory my_dir access parameters
  (records delimited by newline
        fields (txt_row char(2000)
     ))
 location ('myfile.xtx')
 );

create table txt_table (nome varchar2(200), data_nascita date )
 organization external
 (type ORACLE_LOADER default directory my_dir access parameters
  (records delimited by newline
        fields (nome char(200), data_nascita CHAR(10) date_format DATE mask "mm/dd/yyyy"
     ))
 location ('myfile.xtx')
 );

create table txt_table (nome varchar2(200), data_nascita date )
 organization external
 (type ORACLE_LOADER default directory my_dir access parameters
  (records delimited by newline
  fields terminated by ','
  missing field values are null
  reject rows with all null
        fields (nome char(200), data_nascita CHAR(10) date_format DATE mask "mm/dd/yyyy"
     ))
 location ('myfile.xtx')
 );

L'unico problema di questa tecnica è che dobbiamo utilizzare file localizzati in folder fisici e non virtuali (accessibili da URI).
Ma anche questo si può fare...

Esempi ulteriori li trovate qui: http://psoug.org/reference/externaltab.html







Comments Posted (0)

Posta un commento