2017-08-04 2 views
0

Je saisis des valeurs d'un fichier CSV dans une table Oracle à l'aide d'un script SQL * Loader. Dans ce tableau il y a des champs avec NOT NULL contraintes. Dans mon fichier CSV le champ correspondant est "" et je voudrais mettre une chaîne vide dans la table Oracle quand cela arrive.sqlloader avec contrainte NOT NULL dans la table oracle

Ceci est mon fichier de contrôle:

LOAD DATA 
    infile 'F:\tar.csv' 
    REPLACE 
    INTO TABLE tar 
    fields terminated by ',' optionally enclosed by '"' 
    TRAILING NULLCOLS 
    (IDTAR , 
DATABACKUP DATE "YYYY-MM-DD", 
PAESE , 
R_ELEM NULLIF (R_ELEM=BLANKS)) 

et ceci est l'erreur dans le fichier journal:

ORA-01400:.. Ne peut pas insérer NULL dans ("MY_SCHEMA" "RAT" "PAESE ")

Comment puis-je éviter l'erreur en fournissant une valeur différente?

+0

Que voulez-vous dire par une chaîne vide? Une chaîne vide est la même que null dans Oracle, alors voulez-vous dire un ou plusieurs caractères d'espaces? Y compris votre tableau DDL et exemples de données de votre fichier CSV serait utile aussi. –

+0

Une chaîne vide est la même que null dans Oracle .Ahh !!! C'est le point !!! –

+0

["Oracle Database traite actuellement une valeur de caractère nulle avec une longueur égale à zéro, mais cela ne sera peut-être pas vrai dans les versions ultérieures et Oracle recommande de ne pas traiter les chaînes vides comme des valeurs nulles."] (Https : //docs.oracle.com/database/121/SQLRF/sql_elements005.htm#SQLRF30037) –

Répondre

1

Vous pouvez apply an SQL operator, tel que NVL(:PAESE, 'XXX'). Notez les deux points avant la référence au nom du champ. In situ:

LOAD DATA 
    infile 'gian.csv' 
    REPLACE 
    INTO TABLE tar 
    fields terminated by ',' optionally enclosed by '"' 
    TRAILING NULLCOLS 
    (
    IDTAR, 
    DATABACKUP DATE "YYYY-MM-DD", 
    PAESE "NVL(:PAESE, 'XXX')", 
    R_ELEM NULLIF (R_ELEM=BLANKS) 
) 

Avec une table factice:

créer goudron de table ( numéro de idtar, Date de DataBackup, Paese varchar2 (10) non nulle, r_elem varchar2 (10) );

et CSV, où les 3e et 4e lignes ont des espaces de fin de la clause nullif():

1,2017-08-01,A,B 
2,2017-08-02,C, 
3,2017-08-03,,  
4,2017-08-04,"",  

en cours d'exécution puis avec ce fichier de contrôle avait:

SQL*Loader: Release 11.2.0.4.0 - Production on Fri Aug 4 19:39:23 2017 

Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. 

Commit point reached - logical record count 4 

et le journal dit:

... 
    Column Name     Position Len Term Encl Datatype 
------------------------------ ---------- ----- ---- ---- --------------------- 
IDTAR        FIRST  * , O(") CHARACTER 
DATABACKUP       NEXT  * , O(") DATE YYYY-MM-DD 
PAESE        NEXT  * , O(") CHARACTER 
    SQL string for column : "NVL(:PAESE, 'XXX')" 
R_ELEM        NEXT  * , O(") CHARACTER 
    NULL if R_ELEM = BLANKS 


Table TAR: 
    4 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. 
... 

L'interrogation du tableau montre que les quatre lignes ont été chargées:

set null "<null>" 
select * from tar; 

    IDTAR DATABACKU PAESE  R_ELEM  
---------- --------- ---------- ---------- 
     1 01-AUG-17 A   B   
     2 02-AUG-17 C   <null>  
     3 03-AUG-17 XXX  <null>  
     4 04-AUG-17 XXX  <null>  

Remplacez évidemment 'XXX' par la chaîne par défaut que vous souhaitez utiliser. Vous avez dit 'une chaîne vide', vous pouvez donc utiliser "NVL(:PAESE, ' ')" pour insérer un seul caractère d'espace par exemple. Vous ne pouvez pas utiliser une chaîne vide, car c'est la même chose que null en ce qui concerne Oracle.