Lorsque j'utilise sql*loader en MODE DIRECT avec les fonctions trim (cf ctl ci-dessous), la donnée est insérée dans la base même si la longueur dépasse la taille maxi de la colonne.
Exemple pour la colonne status :
le ctl :
load data
infile '/data/in/fedex/gsmart_status_txt.10'
replace into table STATUS_FULL_DUMP_10
fields terminated by '|'
trailing nullcols
(bus_org_id "trim(:bus_org_id)",
org_id "trim(:org_id)",
nname "trim(:nname)",
status "trim(:status)",
x_downtrader "trim(_downtrader)",
x_ship_status_cd "trim(_ship_status_cd)",
x_country "trim(_country)",
current_date "trim(:current_date)"
)
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> desc STATUS_FULL_DUMP_10
Name Null? Type
----------------------------------------- -------- ----------------------------
BUS_ORG_ID VARCHAR2(10 CHAR)
ORG_ID VARCHAR2(20 CHAR)
NNAME VARCHAR2(100 CHAR)
STATUS VARCHAR2(10 CHAR)
X_DOWNTRADER VARCHAR2(20 CHAR)
X_SHIP_STATUS_CD VARCHAR2(20 CHAR)
X_COUNTRY VARCHAR2(20 CHAR)
CURRENT_DATE VARCHAR2(30 CHAR)
SQL>
Exemples de fichier de données (3 lignes commençant par un chiffre)
279219536|251673225|L|PERTZ, HELGA|1|Not relevant|LOST|Germany|2008-11-14 16:03:01
279219536|251673225|L| PERTZ, HEL|1|Not relevant|LOST|Germany|2008-11-14 16:03:01
276529380|231848886|GR|TMACHER, GRAVERT& PARTNER|1|Not relevant|LOST|Germany|2008-11-14 16:03:01
la quatrième colonne STATUS dans cet exemple de données fait plus de 10 caractères, si on applique la fonction trim sur STATUS, le loader ne devrait charger que la 2eme ligne et pourtant il charge sans pb les 3 lignes !!
l erreur se produit en mode direct avec des fonctions PL (trim ou autre)!!
extrait du log :
Column Name Position Len Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
BUS_ORG_ID FIRST * | CHARACTER
SQL string for column : "trim(:bus_org_id)"
ORG_ID NEXT * | CHARACTER
SQL string for column : "trim(:org_id)"
NNAME NEXT * | CHARACTER
SQL string for column : "trim(:nname)"
STATUS NEXT * | CHARACTER
SQL string for column : "trim(:status)"
X_DOWNTRADER NEXT * | CHARACTER
SQL string for column : "trim(_downtrader)"
X_SHIP_STATUS_CD NEXT * | CHARACTER
SQL string for column : "trim(_ship_status_cd)"
X_COUNTRY NEXT * | CHARACTER
SQL string for column : "trim(_country)"
CURRENT_DATE NEXT * | CHARACTER
SQL string for column : "trim(:current_date)"
Table STATUS_FULL_DUMP_10:
3 Rows successfully loaded.
0 Rows not loaded due to data errors.
0 Rows not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null.
Dans la base apres chargement, je retrouve des données tronquées a 10c avec des longueurs trop grandes :
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select status,length(status) from STATUS_FULL_DUMP_10;
STATUS LENGTH(STATUS)
---------- --------------
PERTZ, HEL 12
PERTZ, HEL 10
TMACHER, G 25
SQL> desc STATUS_FULL_DUMP_10
Name Null? Type
----------------------------------------- -------- ----------------------------
BUS_ORG_ID VARCHAR2(10 CHAR)
ORG_ID VARCHAR2(20 CHAR)
NNAME VARCHAR2(100 CHAR)
STATUS VARCHAR2(10 CHAR)
X_DOWNTRADER VARCHAR2(20 CHAR)
X_SHIP_STATUS_CD VARCHAR2(20 CHAR)
X_COUNTRY VARCHAR2(20 CHAR)
CURRENT_DATE VARCHAR2(30 CHAR)
SQL>
une idée ?
Partager