Oracle
 sql >> Database >  >> RDS >> Oracle

Sql loader - seconda stringa di enclosure non presente

Se il tuo ultimo campo è sempre presente (sebbene trailing nullcols suggerisce che non lo è) e hai un certo controllo sulla formattazione, puoi utilizzare CONTINUEIF direttiva per trattare la seconda riga come parte dello stesso record logico.

Se i comments il campo è sempre presente e racchiuso tra virgolette quindi puoi fare:

...
truncate
continueif last != x'22'
into table ...

Che gestirebbe record di dati come:

S;Y;"Test 1"
F;N;"Test 2"
P;Y;"Test with
new line"
P;N;""

Oppure se hai sempre un delimitatore dopo il campo dei commenti, indipendentemente dal fatto che sia popolato o meno:

...
truncate
continueif last != ';'
into table ...

Che gestirebbe:

S;Y;Test 1;
F;N;"Test 2";
P;Y;Test with
new line;
P;N;;

Entrambi i modi caricheranno i dati come:

S M COMMENTS
- - ------------------------------
S Y Test 1
F N Test 2
P Y Test withnew line
P N

Ma questo perde la nuova riga dai dati. Per mantenerlo è necessario che sia presente il delimitatore di campo di terminazione e invece di CONTINUEIF è possibile modificare il separatore di record utilizzando il formato del record di flusso :

...
infile 'C:\Users\lab.csv' "str ';\n'"
truncate
into table ...

Il "str ';\n'" definisce il terminatore come la combinazione del terminatore di campo e un nuovo carattere di riga. Il tuo commento diviso ha solo quella combinazione nella riga finale. Con lo stesso file di dati della versione precedente, questo dà:

S M COMMENTS
- - ------------------------------
S Y Test 1
F N Test 2
P Y Test with
    new line

P N

4 rows selected.

Dato che sei su Windows, potresti dover includere \r anche nel formato, ad es. "str ';\r\n'" , ma non sono in grado di verificarlo.