Caricare file csv come tabella Oracle

Se avete già fatto questa operazione con Access, MySql, SqlServer o che ne so io, dimenticate di trovare una guida del tipo “fate tasto destro e…” perchè in Oracle tasto destro non l’hanno nemmeno implementato, non so se esiste qualche interfaccia Oracle sensibile al tasto destro ma penso di no.

Al dilà di quello che leggerete sotto su come caricare un csv in Oracle, sappiate che non c’è scritta tutta una serie di cose, tipo che se nel csv avete testi che vanno a capo non funziona, che lettere accentate o caratteri strani vi causeranno problemi anche su installazioni di oracle in italiano, che probabilmente passerete del tempo a sistemare i maledetti dati che vi sono arrivati a seguito di un commerciale che si sarà venduto qualcosa al grido di “vabbè ma tanto poi i dati li carichiamo da excel”.
L’unico vero consiglio che vi posso dare è il seguente: non andate in giro a dire che caricate fogli excel in Oracle, perchè non è cosi.

Ad ogni modo vediamo come caricare il maledetto csv o excel che ci ha mandato il cliente, dopo averlo con cura riempito di dati incoerenti, mal formattati, colorati e incasellati stile battaglia navale.

Per caricare un file csv, o un excel salvato in csv, è innanzitutto necessario copiare il file in una directory Oracle registrata.
Per conoscere quali directory sono registrate in Oracle, basta eseguire questa query:
select * from all_directories
con questa query possiamo sapere il nome della directory e il relativo percorso su filesystem.
Scegliere una delle directory, ad esempio DATA_PUMP_DIR e copiare il file csv nel relativo percorso.
A questo punto bisogna creare una tabella collegata a dati esterni, con un numero e tipo di campi coerenti con il file csv di partenza, come nell’esempio seguente.
Supponendo che il file csv abbia 3 campi, Nome, Cognome, Indirizzo, lo script di creazione sarà
CREATE TABLE DATIESTERNI_XLS (
NOME VARCHAR2(50),
COGNOME VARCHAR2(50),
INDIRIZZO VARCHAR2(100)
)

Organization external
(type oracle_loader
default directory DATA_PUMP_DIR
access parameters (records delimited by newline
fields terminated by ‘;’
MISSING FIELD VALUES ARE NULL )
location (‘fileesterno.csv’))
reject limit 15000 ;
Come si nota, il nome della tabella è indifferente, mentre il tipo e la dimensione dei campi deve essere uguale o superiore(la dimensione) ai dati contenuti nel csv.
“records delimited by newline” indica che la terminazione del record è identificata dal carattere di fine riga/nuova linea
mentre “fields terminated by ‘;'” indica quale separatore cercare per identificare i valori di ogni singolo campo.
“location (‘fileesterno.csv’)” è invece il nome del file csv da importare, senza l’intero percorso.
Una volta lanciato lo script, verrà creata la tabella in ogni caso, e verranno creati due file di log, nella cartella in cui è contenuto il file csv.
Il primo è un log della procedura, che riporta eventuali errori di importazione per ogni singola riga, e si chiamerà, in questo esempio, DATIESTERNI_XLS_xxxx_xxxx.log.
Il secondo file riporta le righe del csv che non sono state importate in seguito ad errori di caricamento, e si chiamerà, in questo esempio, DATIESTERNI_XLS_xxxx_xxxx.bad.
ATTENZIONE: finchè non facciamo nessuna query di selezione, Oracle non cercherà di importare i dati e quindi, non vedendo log di errori, potreste pensare che sia andato tutto ok, ma non è cosi. Dovete fare almeno una SELECT perchè effettivamente siano caricati i dati in tabella.

Se la procedura è andata completamente a buon fine, eseguendo la query
select count(*) from DATIESTERNI_XLS;
otterremo lo stesso numero di righe del file csv.
N.B: se la prima riga del csv contiene le intestazioni di colonna, esse verranno importate come una normale riga dati, per cui è bene toglierla dal file csv editandolo con il notepad.
Fatto questo, la tabella DATIESTERNI_XLS è utilizzabile come una normalissima tabella Oracle IN SOLA LETTURA.
E’ anche vero che se apriamo il file csv e modifichiamo una riga, automaticamente essa verrà riportata nella tabella collegata.
Se si desidera utilizzare la tabella anche in scrittura, basta creare una tabella identica a quella collegata, con il comando
CREATE TABLE DATIESTERNI AS SELECT * FROM DATIESTERNI_XLS
In questo modo avremo una tabella Oracle disponibile al 100%, anche in scrittura, non più collegata al file excel e gestita con i normali meccanismi di storage di Oracle.

Annunci
  1. Lascia un commento

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: