Oracle Lessons

Oracle Tabelle Esterne Lezione 3


  Opzioni per la creazione di tabelle esterne.Nella clausola organization external sono contenute quattro sottoclassi principali:Type;Default directory;Access parameters;Location;Quando si crea una tabella esterna, si possono utilizzare queste clausole per personalizzare il modo in cui Oracle visualizza i dati esterni.Type e default directoryLa sintassi del componente type è :([ type tipo_driver_accesso ] proprietà_dati_esterni )[reject limit {intero | unlimited }]Per le tabelle esterne il driver di accesso è l’API utilizzato per trasformare i dati esterni, si utilizzi il componente type ORACLE_LOADER, come mostrato negli esempi precedenti, o ORACLE_DATAPUMP se si usa il Data Pump. Il driver ORACLE_DATAPUMP consente di scaricare i dati in una tabella esterna e di ricaricarli in un database di Oracle. E’ necessario specificare il driver di accesso ORACLE_DATAPUMP se si utilizza la clausola as subquery per scaricare i dati da un database e ricaricarli in un altro. Il driver di accesso ORACLE_LOADER è quello di default.NOTA: Dato che il driver di accesso fa parte del software di oracle, solamente ai file che sono accessibili dal database si potrà accedere come tabelle esterne. I file cui gli utenti Oracle non possono accedere non potranno essere utilizzati come tabelle esterne.Dopo la dichiarazione di type è possibile impostare un valore “reject limit”. Per default nessuna riga può essere rifiutata; qualsiasi tipo di problema con una riga qualunque comporterà la restituzione da parte dell’istruzione select di un errore. Si crei un’altra copia dei dati di BIBLIOTECA in un file separato, ma questa volta si dovranno lasciare nel file le linee aggiuntive che SQL*Plus inserisce durante l’operazione di spool. Successivamente si crei una nuova tabella che fa riferimento a questo file di spool, comunicando a Oracle di saltare il primo record (skip 1) e di consentire un altro errore (reject limit 1). Ciò spiega il simbolo “/” nella prima linea, e “SQL>spool off” nell’ultima linea:create table BIBLIOTECA_EXT_2(Titolo varchar2(100),Editore varchar2(20),NomeCategoria varchar2(20),Classificazione varchar2(2))organization external(type ORACLE_LOADERDefault directory LIBRO_DIRAccess parameters (record delimited by newline Skip 1 fields terminated by “;”(Titolo char(100),Editore char(20),NomeCategoria char(20),Classificazione char(2)))Location (‘bookshelf_dump.lst’))Reject limit 1;La clausola default directory specifica quale oggetto di directory utilizzare per tutti quei file di dati che non specificano un’altra directory. Se si usano più file esterni collocati in più directory, si potrà chiamare una di queste come directory predefinita e specificare le altre con nomi di directory nella clausola location. Nella clausola location si dovranno usare nomi di oggetti di directory (come LIBRO_DIR) e non il percorso della directory completo.Parametri di AccessoLa clausola “access parameters” comunica a Oracle come associare le righe contenute nel file alle righe contenute nella tabella.Per prima cosa si comunica a Oracle come creare un records, se la sua lunghezza è fissa o variabile, e poi come sono delimitate le righe.Se in una linea singola ci fossero più righe, si potrebbe usare una stringa di caratteri come separatore per le varie righe. Visto poi che i dati esterni potrebbero arrivare da un database esterno non Oracle, vengono supportati più set di caratteri e più dimensioni di stringa.Come accadeva con SQL*Loader, esiste la possibilità di specificare una clausola “when” per limitarla ai soli libri contenuti nella categoria ILLUSRAGAZZI.create table BIBLIOTECA_EXT_3(Titolo varchar2(100),Editore varchar2(20),NomeCategoria varchar2(20),Classificazione varchar2(2))organization external(type ORACLE_LOADERDefault directory LIBRO_DIRAccess parameters (record delimited by newline Load when NomeCategoria = ‘ILLUSRAGAZZI’ Skip 1 fields terminated by “;”(Titolo char(100),Editore char(20),NomeCategoria char(20),Classificazione char(2)))Location (‘bookshelf_dump_2.lst’))Reject limit 1;La tabella BIBLIOTECA_EXT_3 accede allo stesso file di BIBLIOTECA_EXT_2, tuttavia mostra solo i record per la categoria ILLUSRAGAZZI per via della sua clausola load when. Come accadeva con il SQL*Loader, esiste la possibilità di creare un file di log, un file non valido e un file di scarto. Le righe che non rispettano le condizione “load when” verranno scritte nel file di scarto. Le righe che non rispettano la condizione di “access parameters” verranno scritte nel file non valido, mentre i dettagli di caricamento verranno scritte nel file di log. Per tutti e tre i tipi di file, è possibile specificare un oggetto di directory insieme al nome file, in modo che sia possibile scrivere l’output in una directory diversa da quella del file di dati di input.E’ possibile specificare “nodiscardfile”, “nobadfile” e “nologfile” per impedire la creazione di questi file. Occorre utilizzare i nomi di oggetti di directory (come LIBRO_DIR) quando si specificano le posizioni dei file di scarto, dei file non validi e dei file di log. Se non si specificano delle posizioni per i file di log, i file non validi e i file di scarto, Oracle li creerà nella directory predefinita con i nomi generati dal sistema.Nella clausola “access parameters” si dovranno specificare anche definizioni e delimitatori di campo, come:fields terminated by “;”(Titolo char(100),Editore char(20),NomeCategoria char(20),Classificazione char(2))Per impostare i valori di colonna NULL si può ricorrere alla clausola “missing field values are null”, tuttavia occorre prestare molta attenzione quando si usa questa opzione perché possono essere trattate anche righe che sarebbero da scartare per non conformità di definizione, nel caso not null (ad esempio righe del tipo SQL>spool off perché ha null alcune colonne).Access parameters (record delimited by newline Load when NomeCategoria = ‘ILLUSRAGAZZI’ Skip 1 fields terminated by “;”missing field values are nullNella maggior parte dei casi però l’integrità dei dati verrà garantita meglio costringendo le righe a fallire (in file non validi o di scarto) e valutando le righe fallite separatamente dai file generali.LocationNella clausola “location” si specificano i file di dati da utilizzare come dati di origine per la tabella. Nella clausola “location” è possibile nominare più file se si trovano tutti in oggetti directory per i quali l’utente possiede il privilegio READ. L’esempio seguente associa due file di spool di BIBLIOTECA separati per illustrare la capacità di combinare più file in un'unica tabella esterna:create table BIBLIOTECA_EXT_4(Titolo varchar2(100),Editore varchar2(20),NomeCategoria varchar2(20),Classificazione varchar2(2))organization external(type ORACLE_LOADERDefault directory LIBRO_DIRAccess parameters (record delimited by newline Skip 1 fields terminated by “;”(Titolo char(100),Editore char(20),NomeCategoria char(20),Classificazione char(2)))Location (‘bookshelf_dump_2.lst’,’bookshelf_dump.lst’))Reject limit 1;L’ordine dei file è importante:‘skip 1’ si riferisce al primo file e non al secondo.