How load text file with special characters in Oracle - oracle

I have a text file with the following info.
The file contains special characters í, ñ, ó
But when I run sql loader the special characters are not displayed
Text file
20200|Cobro Reconex de líneas mora
20900|ICE de Telecomunicación S
1000|MUÑOZ LEON JACINTO DAVID
Table LOAD_RESP
create table LOAD_RESP
(
code VARCHAR2(20),
description VARCHAR2(1000)
)
CTL File
OPTIONS (SILENT=(ALL, HEADER))
load data
CHARACTERSET UTF8
infile test_output1.txt
badfile test_output1.bad
discardfile test_output1.dis
append
into table LOAD_RESP
fields terminated by '|'
TRAILING NULLCOLS
(
CODE CHAR(20),
DESCRIPTION CHAR(1000)
)
SQL Loader
sqlldr user/pass control=CTLFile.ctl log=File.log rows=10000 direct=true errors=2147483648
Querying the table displays the question mark
How can I load this info along with the special characters?

Related

How to load string into a clob column using SQL Loader?

See table and control file in the bottom. It works if my LOAD_CLOB column data type is varchar2 instead of clob. If the column is clob datatype, it throws an error.
SQL*Loader-309: No SQL string allowed as part of HEBE_AHRA_DETAILS field specification
But I need the datatype to be clob because the string will be long.
Create table Table_load
(Row_id varchar2(20),
Load_clob clob);
Control File
OPTIONS (SKIP=1, DIRECT=true)
UNRECOVERABLE
load data
infile 'LOAD.txt'
badfile 'BAD.bad'
discardfile 'Discard.dsc'
replace
into table Table_load
fields terminated by "|" TRAILING NULLCOLS
( ROW_ID ":ROW_ID",
LOAD_CLOB "'Current Row ID '||:ROW_ID"
)

Multibyte character error in Oracle while trying to load block elements

We have flat file which we are trying to load into an Oracle 19c table using SQL*Loader, but it fails with "Multibyte character error" for one of the CHAR(2) field. We know it's a junk value but still we have to load it into the database. The database character set is AL32UTF8.
The value we are trying to load is a block element : U+2592 ▒ Medium shade
We tried using UTF-8 in the SQL*Loader control file but are still facing the same issue. Any advice how to proceed?
Command:
sqlldr $connection parfile=SCHEMA.TABLE.par
Error:
Record 1: Rejected - Error on table SCHEMA.TABLE, column COL2.
Multibyte character error.
COLUMN info :COL2 CHAR(2) NOT NULL ENABLE
Parameter file contents:
data=filename.dat
control=SCHEMA.TABLE.ctl
log=SCHEMA.TABLE.log
bad=SCHEMA.TABLE.bad
Control file contents:
OPTIONS (BINDSIZE=20000000,READSIZE=10485760,ROWS=10000,DIRECT=FALSE,ERRORS=50)
LOAD DATA
CHARACTERSET 'AL32UTF8'
DISCARDMAX 100
REPLACE PRESERVE BLANKS INTO TABLE SCHEMA.TABLE
TRAILING NULLCOLS
(
COL1 POSITION(1:15) "NVL(:COL1,' ')",
COL2 POSITION(16:17) "NVL(:COL2,' ')"
)
File characterset:
filename.dat: text/plain; charset=utf-8
OS: GNU/Linux
From the documentation:
The start and end arguments to the POSITION parameter are interpreted in bytes, even if character-length semantics are in use in a data file.
So POSITION(16:17) is the 16th and 17th bytes of the line, not 16th (and only, in your example) character. The U+2592 character is three bytes in UTF-8 - 0xE2 0x96 0x92 (e29692) - and you're only looking at the first two bytes; and those on their own don't represent a valid character.
You can change from using POSITION to using CHAR with the fixed length of each field, and specify LENGTH SEMANTICS CHARACTER:
OPTIONS (BINDSIZE=20000000,READSIZE=10485760,ROWS=10000,DIRECT=FALSE,ERRORS=50)
LOAD DATA
CHARACTERSET 'AL32UTF8'
LENGTH SEMANTICS CHARACTER
DISCARDMAX 100
REPLACE PRESERVE BLANKS INTO TABLE SCHEMA.TABLE
TRAILING NULLCOLS
(
COL1 CHAR(15) "NVL(:COL1,' ')",
COL2 CHAR(2) "NVL(:COL2,' ')"
)

Default value in an Oracle SQL*Loader control file

I have an SQL*Loader control file which is used to transfer data from an XML file to an Oracle database.
My control file is as follows:
options (errors=100,silent=feedback)
load data
infile "dest/TMP-TMP_Employee.xml" "str '</RECORD>'"
replace
into table "TMP_Employee"
TRAILING NULLCOLS
(
DUMMY filler terminated by "<RECORD>",
ID_EMP enclosed by "<ID_EMP>" and "</ID_EMP>",
ORIGINE enclosed by "<ORIGINE>" and "</ORIGINE>",
CODE_TYPE_ORDRE enclosed by "<CODE_TYPE_ORDRE>" and "</CODE_TYPE_ORDRE>",
CODE_STATUS enclosed by "<CODE_STATUS>" and "</CODE_STATUS>",
INDICATOR enclosed by "<INDICATOR>" and "</INDICATOR>"
)
I have added a new column, FULL_TIME, to the TMP_Employee, of type VARCHAR2(1 BYTE).
I need to add the column FULL_TIME in the control file with a default value "0". I added it as follows:
options (errors=100,silent=feedback)
load data
infile "dest/TMP-TMP_Employee.xml" "str '</RECORD>'"
replace
into table "TMP_Employee"
TRAILING NULLCOLS
(
DUMMY filler terminated by "<RECORD>",
ID_EMP enclosed by "<ID_EMP>" and "</ID_EMP>",
ORIGINE enclosed by "<ORIGINE>" and "</ORIGINE>",
CODE_TYPE_ORDRE enclosed by "<CODE_TYPE_ORDRE>" and "</CODE_TYPE_ORDRE>",
CODE_STATUS enclosed by "<CODE_STATUS>" and "</CODE_STATUS>",
INDICATOR enclosed by "<INDICATOR>" and "</INDICATOR>",
IC_REMUNEREE DEFAULT 0
)
But this is not working. Any idea how to do it correctly?

SQL Loader - How do I escape an terminating character

Friends,
I have had a client data sent to me in that is requested to have fields terminated by '|'
Problem is, some of the filed values also have the "|" as a character that we need to preserve.
Problem rows in my datafile look like this (the '|' in the addres "1|34-36 ..." is the issue)
ID | Address |UPDATEDATE
1423 | 1|34-36 White Street |02/01/199
my .ctl looks like this
options(errors=1000)
load data
into table client_address APPEND
fields terminated by '|'
TRAILING NULLCOLS
(
ID INTEGER EXTERNAL,
If all fields in data file are width-aligned, you could use this .ctl file:
load data
into table client_address APPEND
fields terminated by '~'
TRAILING NULLCOLS
(
line BOUNDFILLER,
ID "to_number(trim(substr(:line,1,8)))",
Address "trim(substr(:line,10,26))",
UPDATEDATE "to_date(trim(substr(:line,37)),'mm/dd/yyyy')"
)
EDIT :
If fields are not width-aligned, but Address is the only field which can contain '|' char inside, then use this .ctl file
load data
into table client_address APPEND
fields terminated by '~'
TRAILING NULLCOLS
(
line BOUNDFILLER,
ID "to_number(trim(regexp_substr(:line,'^[^|]*')))",
Address "trim(regexp_replace(:line,'^[^|]*\|(.*)\|[^|]*$','\1'))",
UPDATEDATE "to_date(trim(regexp_substr(:line,'[^|]*$')),'mm/dd/yyyy')"
)

Loading text file in oracle from unix system

I am having text file contaning field in below manner.
"64252368","7489040","305762",
"64285217","12132108","787341",
I am using a below control file.
OPTIONS (SKIP=1)
LOAD DATA
TRUNCATE INTO TABLE test_table
FIELDS TERMINATED BY '",'
(
LEARNEVENT_ID,
ORGANIZATION,
COURSE_ID
)
But, I am getting the error:
Record 1: Rejected - Error on table test_table, column LEARNEVENT_ID
ORA-01722: invalid number
Kindly help me on it.
You need to change your ctl file to include OPTIONALLY ENCLOSED BY option.
OPTIONS (SKIP=1)
LOAD DATA
TRUNCATE INTO TABLE test_table
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
(
LEARNEVENT_ID,
ORGANIZATION,
COURSE_ID
)
I'd recommend reading up on SQL*Loader.
The problem lays with the encapsulation of the numbers with the quotes " " and your fields terminated by '",' simply does not strip the quotes.
Try this
OPTIONS(SKIP=1)
LOAD DATA
TRUNCATE INTO TABLE test_table
FIELDS TERMINATED BY ','
TRAILING NULLCOLS
(
LEARNEVENT_ID "replace ( :LEARNEVENT_ID ,'"', '')",
ORGINAZATION "replace ( :ORGINAZATION ,'"', '')",
COURSE_ID "replace ( :COURSE_ID ,'"', '')"
)

Resources