Programmazione
Asp
Asp.NET
Java
Javascript
Php
Oracle

Svaghi
Ascolta Radio
Faccine
Libri
Links

Varie
Cerca nel sito...
Segnalazioni
Scrivimi


Utilizzare SQL LOADER

Sql*loader è un tool utile per il caricamento di dati in tabelle del DB che possono essere letti sia da file di testo che da nastro, chiaramente precedentemente formattati secondo le direttive decise in fase di analisi.
Come le altre utility anche questa ha un help e si attiva eseguendo il comando sqlldr da prompt in modo da poter visualizzare tutte le possibili opzioni.
Qui di seguito è riportato un breve prontuario per il suo utilizzo.

TIPO
Comando SQL*LOADER

SINTASSI
SQLLDR [USERID=utente/password]
CONTROL=file [LOG=file]
[BAD=file]
DATA=file
[DISCARD=file]
[DISCARDMAX=intero]
[SKIP=intero]
[LOAD=intero]
[ERRORS=intero]
[ROWS=intero]
[BINDSIZE=intero]
[SILENT=(ALL | [HEADER | FEEDBACK | ERROR | DISCARDS] )]
[DIRECT=TRUE]

ESECUZIONE
- Da DOS (CMD)
- Creando un file .BAT (una SHELL in Unix) nella modalità spiegata in seguito

DESCRIZIONE
SQLLOAD carica in un database ORACLE i dati contenuti all'interno di file esterni.
SQL*LOADER richiede due tipi di file:
- i file di dati che contengono le informazioni da caricare in ORACLE
- i file di controllo che contengono le informazioni riguardanti il formato dei dati, i record e i campi contenuti nei file di dati, l'ordine in cui devono essere caricati e il nome dei file di dati.
Le informazioni del file di controllo possono comunque essere conglobate nei file di dati.
SQLLOAD crea automaticamente un file di log (.log), un file con il resoconto dei problemi (.bad) e, se viene utilizzato DISCARDMAX un file di annullamento (.dsc).
Si possono separare gli argomenti di SQLLOAD con delle virgole.
Si può inserire una stringa di specificazione di un database SQL*NET per collegarsi a un database remoto e caricarvi i dati.

- CONTROL specifica il nome del file contenente il formato dei dati e le istruzioni di caricamento. (.ctl)
- LOG specifica il nome del file che conterrà il report di SQL*LOADER: il nome dei file impiegati, il numero complessivo di record trasferiti e così via. (.log)
- BAD specifica il nome del file che conterrà l'elenco dei record che SQL*LOADER non ha potuto caricare. (.bad)
- DATA specifica il nome del file che contiene i record da caricare. I dati possono essere inclusi anche nello stesso file usato come file di controllo. (.dat o .txt)
- DISCARD specifica il nome del file che contiene quei record che SQL*LOADER non ha né rifiutato né inserito nel database perché non soddisfacevano ai criteri della clausola when del file di controllo o perché contenevano solo campi vuoti. (.dsc)
- DISCARDMAX specifica il numero massimo di record anomali prima di interrompere il caricamento. (=0 non consente di tralasciare alcun record). Eliminare la parola chiave significa consentire infiniti record anomali.
- SKIP imposta il numero di file da saltare dall'inizio del file prima di cominciare il caricamento.
- LOAD imposta il numero massimo di record da caricare.
- ERRORS specifica il numero massimo di errori di inserimento prima che il caricamento venga interrotto. (=0 per interrompere il trasferimento al primo errore. Di default è =50. Per consentire un numero illimitato di errori si specifichi un valore maggiore del numero dei record da caricare.
- ROWS specifica il numero di righe da bufferizzare nei comandi di inserimento e salvataggio. Di default è 64.
- BINDSIZE imposta il massimo numero di byte da utilizzare per la bufferizzazione delle righe nei comandi di inserimento e salvataggio discussi in ROWS. BINDSIZE sovrascrive il valore di default (detto Bind Array) del computer in uso, che varia da macchina a macchina. Se il valore fornito è minore del numero di byte richiesto da
ROWS, BINDSIZE riduce automaticamente il numero di righe bufferizzabili.

- SILENT impone a SQLLOAD di eliminare alcuni messaggi informativi.
o HEADER elimina l'intestazione di SQL*LOADER.
o FEEDBACK elimina il messaggio di risposta (feedback) di ciascun salvataggio.
o ERRORS elimina la registrazione (nel file di log) dei record che hanno causato un errore in ORACLE sebbene il loro numero venga comunque aggiornato.
o DISCARDS elimina la registrazione (nel file di log) dei record tralasciati, sebbene illoro numero venga comunque aggiornato.
o ALL elimina tutti i messaggi precedenti.
Se è necessario inserire più di un'opzione, occorre separarle con delle virgole e racchiuderle tra parentesi.
- DIRECT richiama l'opzione di caricamento a percorso diretto (vedere oltre).

OPTION
Oltre che sulla riga di comando, le ultime sei opzioni possono essere specificate anche nel CONTROL File.
Esse devono essere inserite all'inizio del file di seguito alla parola chiave OPTIONS con il formato seguente:
OPTIONS ({[SKIP=intero] [LOAD=intero] [ERRORS=intero] [ROWS=intero] [BINDSIZE=intero] [SILENT=(ALL | [FEEDBACK | ERROR | DISCARDS] })
Si noti che l'opzione HEADER di SILENT non può essere utilizzata all'interno del file di controllo in quanto nel momento in cui SQLLOAD dovesse leggerla avrebbe comunque già visualizzato la sua intestazione.
Per evitare la visualizzazione dell'intestazione di SQLLOAD non c'è alcuna alternativa alla riga di comando.

CONTROL FILE
Il file di controllo contiene diversi tipi di informazioni essenziali al caricamento dei dati.
Se è presente la parola chiave INFILE, essa specifica il nome del file di dati.
Se è presente BEGINDATA, invece, i dati devono essere caricati dal file di controllo stesso e si trovano immediatamente dopo questa parola chiave (cioè questa dev'essere l'ultimo comando del file di controllo).
Se non sono presenti entambi ORACLE suppone che i dati siano contenuti nel file specificato
sulla riga di comando oppure in un file con lo stesso nome di quello di controllo ma con estensione .dat.
Il file di controllo può specificare:
- informazioni riguardanti i file BAD e DISCARD (anche se con una sintassi leggermente modificata)
- i nomi delle tabelle da caricare (Può anche discriminare quali record caricare (mediante when) e se i record debbano essere aggiunti al fondo della tabella, debbano sostituire quelli eventualmente presenti o se debbano essere inseriti all'interno di una tabella vuota.
- il formato dei record all'interno delle tabelle
- le corrispondenze tra i campi nei record e nelle colonne.

SINTASSI CONTROL FILE
OPTIONS ({[SKIP=intero] [LOAD=intero]
[ERRORS=intero][ROWS=intero]
[BINDSIZE=intero] [SILENT=(ALL | [FEEDBACK | ERROR | DISCARDS] })
LOAD [DATA]
[ { INFILE | INDDN} { file | * }
[ STREAM | RECORD | FIXED lunghezza [BLOCKSIZE dimensione] | VARIABLE[lunghezza] ]
[ { BADFILE | BADDN } file ]
[ { DISCARDS | DISCARDMAX } intero ]
[ { INDDN | INFILE } ...]
[ APPEND | REPLACE | INSERT ]
[ RECLEN intero ]
[ {CONCATENATE intero | CONTINUEIF {[THIS | NEXT ] (in[:fin])| LAST} operat {stringa | X'hex'} } ]
INTO TABLE [utente.]tabella
[APPEND | REPLACE | INSERT ]
[WHEN condizione [ AND condizione ]...]
[FIELDS [delimitatore] ]
(
colonna {
RECNUM | CONSTANT valore | SEQUENCE ( { intero | MAX | COUNT } [ ,incremento ]) |
[ POSITION ( { inizio [ fine} | * [+intero] } ) ]
tipo_dati
[TERMINATED [BY] {WHITESPACE | [X]'character'}]
[[OPTIONALLY] ENCLOSED [BY] [X]'character']
[ NULLIF condizione ]
[ DEFAULTIF condizione ]
}
[ ,... ]
)
[ INTO TABLE ... ]
[ BEGIN DATA ]

SPECIFICHE DEI CAMPI DI DATI
- INFILE e INDDN sono sinonimi; a entrambi deve seguire il nome di un file contenente i dati da caricare.
Se al posto di un nome di file viene inserito un * i dati sono da cercare nel file di controllo stesso, immediatamente
dopo la parola chiave BEGINDATA (che richiede il metodo di lettura di default RECORD descritto più avanti).
È possibile indicare diversi file di dati semplicemente ripetendo la parola chiave INFILE o INDNN seguita dai nomi di file. Ogni file può avere associate diverse opzioni:
- STREAM significa che i dati devono essere letti un byte per volta. I caratteri di avanzamento riga rappresentano i terminatori dei record fisici (i record logici possono essere costituiti di più record fisici).
- RECORD utilizza i metodi di gestione di file e record del sistema operativo in uso. Se i dati sono all'interno del file di controllo viene utilizzato questo metodo.
- FIXED lunghezza significa che i record da leggere sono lunghi esattamente quel numero di byte,indipendentemente dal fatto che siano o meno disposti su righe diverse del file.
Se lunghezza vale 300, SQLLOAD legge 300 byte di dati sia che appaiano sotto forma di un unico record da 300 byte o 300 record da un solo byte.
- BLOCKSIZE specifica la dimensione dei blocchi nel caso questi debbano essere letti da nastro.
- VARIABLE significa che i record verranno letti assumendo che i primi due byte di ciascuno ne contengano la lunghezza (questi byte non vengono ovviamente utilizzati per i dati). La lunghezza opzionale fornisce la massima dimensione dei record; se non viene specificata, ORACLE assume che sia di 8 Kbyte.
-----Alcune delle opzioni descritte di seguito potrebbero non essere disponibili su alcuni sistemi:-
- BADFILE e BADDN sono sinonimi; a entrambi deve seguire il nome di un file in cui verranno scritti i dati rifiutati (quelli che ORACLE non ha potuto caricare nel database).
- DISCARDFILE e DISCARDDN sono sinonimi; a entrambi deve seguire il nome di un file su cui verranno scritti i record non corrispondenti alla clausola when.
- DISCARDS e DISCARDMAX sono sinonimi; il numero intero specifica il massimo numero di record anomali prima che SQLLOAD termini il caricamento del file corrente e passi al successivo (o termini se non ce ne sono altri).
Il valore introdotto rimane lo stesso anche per i file successivi finché un'opzione analoga non lo reimposti.

SPECIFICA DEL METODO DI CARICAMENTO DI DEFAULT PER TABELLE
Se le opzioni seguenti precedono la clausola into table, specificano il metodo di caricamento di tutte le tabelle in cui non è specificata.
- APPEND aggiunge le righe al fondo della tabella.
- INSERT inserisce le righe solo all'interno di una tabella vuota, in caso contrario annulla l'operazione.
- REPLACE svuota la tabella e reinserisce le righe.

LUNGHEZZA MASSIMA DEI RECORD
- RECLEN viene utilizzato essenzialmente in due casi:
Quando SQLLOAD non è in grado di calcolare la lunghezza dei record automaticamente o quando si vuol trascrivere un intero record bad nel file bad. Nel secondo caso ORACLE scriverebbe normalmente solo la parte del record precedente l'errore. Se si vuole vederlo interamente, si specifichi manualmente la lunghezza:
in questo modo i record la cui dimensione è inferiore alla lunghezza assegnata vengono trascritti per intero.
SQLLOAD calcola la lunghezza di default per i record a lunghezza variabile e assume che sia di 80 caratteri (salvo indicazioni contrarie) per i file a lunghezza fissa.

COSTRUZIONE DI RECORD LOGICI
Se è necessario comporre più record fisici in un unico record logico (ad esempio il Nome sulla prima riga, l'indirizzo sulla seconda, la Citta e il CAP sulla terza e così via), con CONCATENATE è possibile specificare
l'intero che rappresenta il numero di record fisici da assemblare nel record logico (una tecnica di concatenazione alternativa combina i record fisici solo quando soddisfano alcuni requisiti. Questi vengono specificati dopo CONTINUEIF).
- THIS verifica una condizione sul record corrente. Se è vera il record corrente viene concatenato.
- NEXT verifica una condizione sul record successivo. Se è vera il record successivo viene concatenato a quello corrente.
- inizio: fine o inizio-fine specificano le colonne su cui controllare l'esistenza della stringa di continuazione e quindi per decidere se effettuare la concatenazione. Il controllo viene effettuato tramite un operatore che può essere "uguale" o "diverso".
Per specificare ad esempio che i primi tre caratteri della stringa NEXT devono contenere 'WAG' perché vengano concatenati alla stringa corrente si può scrivere:
continueif next (1-3) = "WAG"
In alternativa alla stringa di caratteri si può specificare una sequenza esadecimale preceduta dalla lettera X.
Ad esempio:
continueif next (1-3) = "0D031F" verifica la presenza dei valori esadecimali 0D, 03 e 1F nelle posizioni dalla 1 a 3.
I caratteri trovati in questo modo sono assunti come non facenti parte del record logico. Se il campo che denota la concatenazione deve essere conglobato nel record logico viene utilizzata la parola chiave last: continueif last = ","

TABELLE PER CARICARE
- INTO TABLE è seguito dal nome della tabella da caricare.
Per caricare diverse tabelle, si crei una sezione INTO TABLE per ciascuna di esse e le si metta nello stesso ordine in cui compaiono nel file di dati.
Per caricare la stessatabella da due file è necessario specificare due volte INTO TABLE.
Per caricare due tabelle dallo stesso file occorre specificare quest'ultimo due volte.
- WHEN è equivalente alla clausola where dell'istruzione select. Verifica delle condizioni sui record per decidere quali caricare nella tabella. WHEN può controllare sia il campo da caricare, sulla base della sua posizione all'interno del record logico, sia il valore da caricare nella colonna, attraverso il nome del campo. Se uno dei controlli fallisce non viene caricata nessuna riga. La condizione verificata è simile a quella utilizzata con CONTINUEIF (e anche con NULLIF e DEFAULTIF, esaminate tra breve).
Il formato della condizione è il seguente:
inizio[ :fine]) | colonna} operatore {"stringa" | X'hex'}
- operatore può essere solo un'uguaglianza o una disuguaglianza (vedere CONTINUEIF), e diverse condizioni possono essere fuse tramite AND (OR non è disponibile).
Ad esempio:
when (3-5) = "SSM" and (22) "*"
oppure:
when Sezione = "A"

TERMINAZIONE ED INSERIMENTO DI CAMPI IN UN RECORD
- FIELDS specifica i delimitatori che eventualmente separano i campi nei record.
Il formato di FIELDS è il seguente:
FIELDS [TERMINATED [BY] {WHITESPACE | [X]'character'}][[OPTIONALLY] ENCLOSED [BY] [X]'character']
- TERMINATED legge i campi a partire dalla fine del campo precedente fino al carattere delimitatore, il quale non viene considerato come parte dei dati.
- WHITESPACE significa che il terminatore è una sorta di spazio bianco (cioè uno spazio, un carattere di tabulazione, un avanzamento riga o pagina e così via). In alternativa può essere indicato un carattere tra apici o, premettendo una X, un numero esadecimale come X'1B'.
- OPTIONALLY ENCLOSED indica che i dati possono essere terminati anche dal carattere TERMINATED (ad esempio un record in cui ciascun campo è separato da virgole).
L'uso di OPTIONALLY richiede necessariamente TERMINATED.
Tutte le opzioni relative ai campi (eccetto la parola FIELDS) possono essere utilizzate anche per le colonne. Se in questo caso viene utilizzato OPTIONALLY, TERMINATED dev'essere qui o, al massimo, nell'istruzione FIELDS.
- ENCLOSED significa che i dati si trovano tra due delimitatori. Se vengono utilizzati sia ENCLOSED che TERMINATED, il loro ordine stabilisce l'ordine di valutazione.
- BY è puramente opzionale e serve semplicemente a migliorare la leggibilità.

DEFINIZIONE DELLE COLONNE
- colonna è il nome di una colonna della tabella. La specifica di ogni colonna è separata per mezzo di virgole e l'elenco è racchiuso tra parentesi.
Ogni colonna può ottenere il proprio valore in quattro modi diversi:
- RECNUM significa che a questa colonna verrà assegnato un valore intero (sequenziale) uguale al numero del record logico letto dal file di dati.
- CONSTANT significa che a questa colonna verrà assegnato il valore costante che segue la parola chiave CONSTANT. Nel caso di colonne CHAR è necessario che la costante sia racchiusa tra apici.
- SEQUENCE differisce da RECNUM per il fatto che la sequenza può partire da un numero scelto arbitrariamente e incrementato a passi maggiori di uno. Ha il formato seguente:
SEQUENCE ( {intero | MAX | COUNT } [,incremento]
La sequenza può iniziare in uno dei tre modi seguenti: da intero, da MAX (cioè dal massimo valore attualmente archiviato nella colonna + incremento), da COUNT (cioè dal numero di righe già presenti nella tabella + incremento). incremento vale 1 per default ma può valere un numero qualsiasi da 1 in su.
I numeri di sequenza vengono incrementati ogni volta che viene aggiunta o respinta una riga. In questo modo però i record respinti producono indici inesistenti; i valori mancanti devono essere inseriti in seguito e i loro numeri di sequenza devono essere assegnati manualmente.
- POSITION specifica la posizione dei dati delle colonne dei record logici. Questa posizione può essere indicata in termini assoluti o relativi alla colonna precedente. Il formato di POSITION è il seguente:
POSITION ( {inizio[: fine] | * [+intero] } )
inizio è la posizione iniziale della colonna del record logico mentre fine segnala opzionalmente la posizione finale. Tra inizio e fine possono essere introdotti i due punti o il trattino. Se non viene specificata la posizione finale SQLLOAD assume una lunghezza di default per la colonna sulla base suo del tipo di dati. Le colonne di tipo CHAR hanno lunghezza di default pari a 1.
Un * significa che questo campo comincia immediatamente dopo il termine di quello precedente.
+intero indica il numero di posizioni da saltare per posizionarsi sull'inizio del record successivo.
Se non viene utilizzato POSITION il metodo utilizzato per default è POSITION(*).
Nel caso venga impiegato più di un metodo per determinare la posizione di un campo di dati (ad esempio delimitatori e posizioni) vengono seguite alcune regole di precedenza. L'elenco che segue mostra l'ordine di priorità in ordine decrescente.
o Lunghezza di un tipo di dati specifico.
o Posizioni inizio e fine.
o Delimitatori.
o Posizione di inizio da sola.

DEFINIZIONE DEL TIPO DI DATI
Sono 14 i tipi di dati utilizzabili nel caricamento tramite SQLLOAD:
CHAR
DATE
DECIMAL EXTERNAL
DECIMAL
DOUBLE
FLOAT
FLOAT EXTERNAL
GRAPHIC
GRAPHIC EXTERNAL
INTEGER
INTEGER EXTERNAL
SMALLINT
VARCHAR
VARGRAPHIC
Di seguito sono elencate le opzioni di formattazione per ciascuno di essi.
TIPI CARATTERE
CHAR [(lunghezza)] [delimitatore]
Se non viene specificata alcuna lunghezza vengono utilizzati i valori di POSITION.
Se neanche questi sono stati impostati la lunghezza viene impostata per default a 1. Se la colonna del database è LONG è indispensabile che qui o in POSITION venga impostata una lunghezza.
TIPI DATA
DATE [(lunghezza)] ["formato di data"] [delimitatore]
Se non viene specificata alcuna lunghezza vengono utilizzati i valori di POSITION.
Il formato di data può essere uno dei formati utilizzati da TO_DATE. Se non viene specificato alcun formato, viene utilizzato il formato di default di ORACLE (DD-MON-YY).
NUMERI DECIMALI IN FORMATO CARATTERE
DECIMAL EXTERNAL [(lunghezza)] [delimitatore]
Questo formato viene utilizzato per i numeri decimali presenti sotto forma di caratteri piuttosto che in formato binario impaccato. Questi numeri vengono quindi trattati come caratteri e usano lo stesso formato di CHAR. Quando però si utilizza DEFAULTIF (esaminato tra breve), per impostare il valore di default a NULL si utilizza CHAR.
NUMERI DECIMALI IN FORMATO COMPATTO
DECIMAL (cifre [,precisione])
Nel formato decimale compattato a ogni cifra corrispondono 4 bit. È di 4 bit anche la rappresentazione del segno. Il parametro cifre indica il numero di cifre del numero (333.33 ne ha 5, non 6). La precisione indica quante cifre mantenere a destra del punto decimale (che è implicito). La precisione può essere maggiore del numero di cifre, nel qual caso si ottiene un numero minore di uno con alcuni zeri dopo il punto. I due parametri devono essere positivi.
NUMERI BINARI A VIRGOLA MOBILE E DOPPIA PRECISIONE
DOUBLE
In questo tipo di dati viene utilizzata la posizione di partenza della clausola position e la lunghezza viene ricavata dalla dimensione dei tipi analoghi sul computer in uso.
NUMERI BINARI A VIRGOLA MOBILE E SINGOLA PRECISIONE
FLOAT
In questo tipo di dati viene utilizzata la posizione di partenza della clausola position e la lunghezza viene ricavata dalla dimensione del tipo analogo sul computer in uso.
NUMERI BINARI A VIRGOLA MOBILE IN FORMATO CARATTERE
FLOAT EXTERNAL [(lunghezza)] [delimitatore]
Il formato utilizzato per i numeri in virgola mobile (siano essi a singola o a doppia precisione) per la loro archiviazione su file è il formato carattere. Questi numeri sono quindi trattati come stringhe di caratteri e seguono lo stesso formato dei tipi CHAR. Quando però si utilizza DEFAULTIF (descritto tra breve), se si vuole che il valore di default sia NULL, si utilizzi CHAR. Se invece si vuole che sia 0, si utilizzi DECIMAL EXTERNAL. Se non viene specificata alcuna lunghezza, viene utilizzata quella impostata in POSITION.
DATI PROVENIENTI DA STRINGHE DI CARATTERI A DOPPIO BYTE (DBCD)
GRAPHIC [(lunghezza)]
Anche se ORACLE non supporta direttamente le stringhe di caratteri a doppio byte, è in grado di leggere i dati sotto forma di stringa a byte singolo e archiviarli in una colonna. La lunghezza può essere definita in due modi: specificandola nei primi due byte della stringa nel qual caso è uguale alla metà del numero di byte necessari per l'archiviazione. Una stringa con 12 byte da 8 bit avrà lunghezza 6; nei primi due byte viene scritto 06 (questi due byte non sono compresi nella lunghezza). La seconda definizione prevede che la lunghezza venga ricavata indirettamente tramite la loro posizione iniziale e finale nel file e viene misurata in byte singoli.
GRAPHIC EXTERNAL [(lunghezza)]
È identico a GRAPHIC senza EXTERNAL, salvo per il fatto che in questo caso si suppone che i campi siano racchiusi tra caratteri di delimitazione. La lunghezza, qualora venga specificata esplicitamente, non comprende i caratteri di delimitazione (shift-in e shift-out).
INTERI BINARI LONG
INTEGER
Per questo tipi di dati viene utilizzata solo la posizione di partenza indicata nella clausola position e la lunghezza viene ricavata da quella del tipo analogo sul sistema in uso. Il tipo corrispondente in C è LONG INT.
INTERI BINARI SHORT
SMALLINT
Per questo tipo di dati viene utilizzata solo la posizione di partenza indicata nella clausola position e la lunghezza viene ricavata da quella del tipo analogo sul sistema in uso.
NUMERI INTERI IN FORMATO CARATTERE
INTEGER EXTERNAL [(lunghezza)] [delimitatore]
Questo formato viene utilizzato per i numeri interi rappresentati nei file mediante caratteri. Questi numeri seguono lo stesso formato dei tipi CHAR. Quando però si utilizza DEFAULTIF (esaminato tra breve), se si vuole che il valore di default sia NULL, si impieghi CHAR. Se si vuole che sia 0, si utilizzi DECIMAL EXTERNAL. Se non viene specificata alcuna lunghezza, vengono utilizzati i valori di position.
STRINGHE DI CARATTERI A LUNGHEZZA VARIABILE
VARCHAR [(lunghezza)]
Per questo tipo di dati viene utilizzata la posizione di partenza di position mentre la lunghezza viene ottenuta dai primi due byte della stringa. La lunghezza riportata qui è solo quella massima del campo e non comprende i due byte che specificano la lunghezza. Il suo scopo è semplicemente quello di favorire l'ottimizzazione dei buffer.
STRINGHE DI CARATTERI A DOPPIO BYTE (DBCS)
VARGRAPHIC [(lunghezza)]
Anche se ORACLE non supporta direttamente le stringhe di caratteri a doppio byte, è in grado di leggere i dati sotto forma di stringa a byte singolo e archiviarli in una colonna. La lunghezza viene riportata nei primi due byte della stringa; la posizione di questi due byte viene specificata dalla parola chiave POSITION. La lunghezza è espressa in doppi byte. È la metà del numero di byte necessari per l'archiviazione. Una stringa con 12 byte da 8 bit ha lunghezza 6; nei primi due byte viene scritto 06 (questi due byte non sono compresi nella lunghezza).

DEFINIZIONE DELLE COLONNE
IMPOSTAZIONE COMPLETA O CONDIZIONALE DI UNA COLONNA A NULL
Una colonna può essere impostata a NULL in maniera condizionale utilizzando la parola chiave NULLIF:
NULLIF {(inizio[:fine]) | colonna} operatore {'string' | "hex"}
operatore può essere un'uguaglianza o una disuguaglianza. Si possono congiungere condizioni diverse per mezzo di AND (OR non è disponibile). Ad esempio:
NULLIF (37-39) = 'DOG' and (22-25} = 'FRED' oppure: NULLIF Eta = '65'
Se si vuole che i valori di una colonna vengano impostati a NULL per ogni nuova riga inserita, basta non includere il nome della colonna all'interno del file di controllo.

IMPOSTAZIONE CONDIZIONALE DI UNA COLONNA NUMERICA A ZERO
Impostazione condizionale di una colonna numerica a zero
La parola chiave DEFAULTIF può essere utilizzata in maniera analoga a NULLIF:
DEFAULTIF {(inizio[:fine]) | colonna} operatore {"string" | X'hex'}
Le due parole chiave sono identiche sulle colonne carattere. Nelle colonne numeriche però DEFAULTIF imposta i valori delle colonne a zero al verificarsi di alcune condizioni mentre NULLIF imposta i valori su NULL. In genere uno solo dei due è sufficiente ma possono esistere dei casi in cui alcune celle devono valere 0 e altre NULL sulla base di condizioni diverse. DEFAULTIF tratta DECIMAL EXTERNAL, FLOAT EXTERNAL e INTEGER EXTERNAL come numeri.

SQL*LOADER - FAQ
Creazione di un file .BAT per il lancio di SQLLoad
cd c:\progetto_csi\CNU\Enrico

sqlldr migrazione_CNU/migrazione_CNU silent=all errors=99999 control=.\ctl\Prestazioni_SC.CTL data=.\dati\Prestazioni_SC.TXT bad=.\bad\Prestazioni_SC.BAD discard=.\dis\Prestazioni_SC.DIS log=.\log\Prestazioni_SC.LOG



Loading USERNAME of user running SQLLoader
How do you load the username of the user running the SQL*Loader session?

Example-I:
=========
In this example, all of the fields are located in the datafile based on position, which makes this easier. Another example below, which is slightly more difficult, covers data that is comma delimited. Both methods take advantage of the "USER" pseudo-variable. If you prefer to use the Oracle User ID number, you could use "UID" instead.

We want to load the data into the following table:

SQL> CREATE TABLE load_user_positional
2 (username CHAR(30),
3 data1 NUMBER,
4 data2 CHAR(15) );


The control file would look like:

LOAD DATA
INFILE *
INTO TABLE load_user_positional
(username "USER"
data1 POSITION(1:5),
data2 POSITION(6:15),
)
BEGINDATA
11111AAAAAAAAAA
22222BBBBBBBBBB

If we run SQL*Loader as scott:

$ SQLLDR scott/tiger load_user_d.ctl

Our table data looks like:

SQL> SELECT * FROM load_user_positional;

USERNAME DATA1 DATA2
-------------- ---------- ---------------
SCOTT 11111 AAAAAAAAAA
SCOTT 22222 BBBBBBBBBB

Caricamento più Veloce dei Dati
Per ottenere delle performance più elevate nel caricamento dei filedata di elevate dimensioni si ha l'opzione DIRECT = TRUE .
Questa opzione inserita nel control file del SQL Loader fa si che i dati vengono caricati direttamente nel Database con una velocità maggiore (poiché il SQL Loader non dove _competere con altri processi Oracle per la risorsa dei buffer) conseguendo così un notevole risparmio di tempo.
Bisogna essere sulla macchina dove vi è il database per utilizzare tale comando.

Es:
OPTIONS (DIRECT = TRUE) Load Data



Modify Data as it Loads into the DataBase
Data can be modified as it loads into the Oracle Database.

LOAD DATA
INFILE test.txt
INTO TABLE modified_data
( rec_no "my_db_sequence.nextval",
region CONSTANT '31',
time_loaded "to_char(SYSDATE, 'HH24:MI')",
data1 POSITION(1:5) ":data1/100",
data2 POSITION(6:15) "upper(:data2)",
data3 POSITION(16:22) "to_date(:data3, 'YYMMDD')"
)



LOAD DATA
INFILE test.txt
BADFILE bad_orders.txt
APPEND
INTO TABLE mailing_list
FIELDS TERMINATED BY ","
( addr,
city,
state,
zipcode,
mailing_addr "decode(:mailing_addr, null, :addr, :mailing_addr)",
mailing_city "decode(:mailing_city, null, :city, :mailing_city)",
mailing_state
)

SQL*LOADER - Example

Campi Delimitati da un Carattere

LOAD DATA
INFILE 'prova.dat' -- prova.dat è il nome del file dati da caricare
APPEND -- come caricare i dati nel DB
INTO TABLE TabName
FIELDS TERMINATED BY ';' --indica il carattere separatore tra i dati
TRAILING NULLCOLS --indica la fine del record,quindi passa al successivo
(
CODLISTINO CHAR,
PERIODO CHAR,
DATAVALUTA DATE 'DD-MM-YYYY',
DENARO INTEGER,
RESSUBSCRIBE CHAR,
DAVALIDARE VARCHAR(2),
FLAGSPEDIZIONE CHAR
)


Dopo aver costruito il CONTROL FILE, da sistema operativo si fa eseguire il comando di sql loader:
SQLLDR80 userid=username/password@SID control=FileName.ctl log= FileName.log bad= FileName.bad data= FileName.txt errors=9999



Campi Posizionali

LOAD DATA
INFILE Anagrafe_SC.txt
INTO table CNU_ANAGRAFICA_SASC_T
INSERT
WHEN FLAG_PERS_FISICA ='1' --PERSONA GIURIDICA
(
VALIDITA POSITION (01:01),
TIPO_RECORD POSITION (02:03),
CODICE_POLIAMBULATORIO POSITION (04:10),
COGNOME_TITOLARE POSITION (11:35),
INDIRIZZO POSITION (87:116),
CAP POSITION (117:121),
)


Campo Formato Date
LOAD DATA
INFILE test_data.txt
INTO table TEST_DATA
INSERT
(
A POSITION (01:02),
B DATE'ddmmrrrr', --IMPORTANTE: nessuno spazio tra DATE e apice
C POSITION (09:10)
)
Campo Formato Number
LOAD DATA
INFILE ct_anagrafica.txt
INTO table CT_ANAGRAFICA_T
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
(
CSO_SOC CHAR,
ANA_MATR DECIMAL EXTERNAL(7),
ANA_CODFIS CHAR,
)



Campo Formato Number Decimale
LOAD DATA
INFILE test.txt
INTO table test
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
(
CampoA DECIMAL EXTERNAL(5),
CampoB DECIMAL EXTERNAL(5) ":C/100"
)