2010-10-12 25 views
15

J'ai un problème sqlldr abstruse qui me dérange. Mon fichier de contrôle ressemble à ceci:Oracle sqlldr TRAVELLING NULLCOLS requis, mais pourquoi?

load data 
infile 'txgen.dat' 
into table TRANSACTION_NEW 
fields terminated by "," optionally enclosed by '"' 
TRAILING NULLCOLS 
(A, 
    B, 
    C, 
    D, 
    ID "ID_SEQ.NEXTVAL" 
) 

données est quelque chose comme ceci:

a,b,c, 
a,b,,d 
a,b,, 
a,b,c,d 

Si je ne mets pas de laisser traîner NULLCOLS dans, je reçois la colonne » pas trouvé avant la fin de logique erreur d'enregistrement. Mais bien que certaines des colonnes soient nulles, les virgules sont toutes là, donc je ne vois pas de raison pour que sqlldr interprète mal le fichier d'entrée, et n'arrive pas à la fin où il génère l'ID de la séquence de base de données.

Cette syntaxe a déjà fonctionné avec aucune colonne null - pourquoi une colonne nulle fait-elle que sqlldr n'atteint pas la colonne générée?

Je l'ai fonctionne, je veux juste comprendre pourquoi!?!

+2

Parce que Larry a dit, c'est pourquoi. C'est le comportement voulu. –

+0

C'est ok que c'est prévu, je veux juste comprendre la mécanique de celui-ci. – orbfish

Répondre

14

Vous avez défini 5 champs dans votre fichier de contrôle. Vos champs sont terminés par une virgule, vous avez donc besoin de 5 virgules dans chaque enregistrement pour les 5 champs sauf si TRAILING NULLCOLS est spécifié, même si vous chargez le champ ID avec une valeur de séquence via la chaîne SQL.

RE: Commentaire de l'OP

Ce n'est pas mon expérience avec un test bref. Avec le fichier de contrôle suivant:

load data 
infile * 
into table T_new 
fields terminated by "," optionally enclosed by '"' 
(A, 
    B, 
    C, 
    D, 
    ID "ID_SEQ.NEXTVAL" 
) 
BEGINDATA 
1,1,,, 
2,2,2,, 
3,3,3,3, 
4,4,4,4,, 
,,,,, 

Produit la sortie suivante:

Table T_NEW, loaded from every logical record. 
Insert option in effect for this table: INSERT 

    Column Name     Position Len Term Encl Datatype 
------------------------------ ---------- ----- ---- ---- --------------------- 
A         FIRST  * , O(") CHARACTER    
B         NEXT  * , O(") CHARACTER    
C         NEXT  * , O(") CHARACTER    
D         NEXT  * , O(") CHARACTER    
ID         NEXT  * , O(") CHARACTER    
    SQL string for column : "ID_SEQ.NEXTVAL" 

Record 1: Rejected - Error on table T_NEW, column ID. 
Column not found before end of logical record (use TRAILING NULLCOLS) 
Record 2: Rejected - Error on table T_NEW, column ID. 
Column not found before end of logical record (use TRAILING NULLCOLS) 
Record 3: Rejected - Error on table T_NEW, column ID. 
Column not found before end of logical record (use TRAILING NULLCOLS) 
Record 5: Discarded - all columns null. 

Table T_NEW: 
    1 Row successfully loaded. 
    3 Rows not loaded due to data errors. 
    0 Rows not loaded because all WHEN clauses were failed. 
    1 Row not loaded because all fields were null. 

Notez que la seule ligne qui avait été correctement chargé 5 virgules. Même la 3ème ligne, avec toutes les valeurs de données présentes sauf ID, les données ne se chargent pas. À moins que je ne manque quelque chose ...

J'utilise 10gR2.

+0

Ce n'est pas le cas, car si les données ont toujours 4 champs (mais pas 5 virgules, ou même 4), vous n'avez pas besoin de TRAILING NULLCOLS. Bien que vous soyez sur quelque chose là-bas, il a presque du sens .... – orbfish

+0

N'a pas été en mesure de valider cela, mais il n'est pas juste de garder vos points en attente .... – orbfish

0

Essayez de donner 5 « » dans chaque ligne, similaire à la ligne numéro 4.

3

Dernière colonne dans votre fichier d'entrée doit avoir des données qu'il contient (que ce soit l'espace ou char, mais non nulle). Je suppose que le 1er enregistrement contient null après le dernier ',' que sqlldr ne reconnaîtra pas à moins qu'on lui demande spécifiquement de reconnaître des valeurs nulles en utilisant l'option TRAILING NULLCOLS. Alternativement, si vous ne voulez pas utiliser TRAILING NULLCOLS, vous devrez prendre soin de ces valeurs NULL avant de passer le fichier à sqlldr. Espérons que cela aide

3

Le problème ici est que vous avez défini ID comme un champ dans votre fichier de données lorsque ce que vous voulez est d'utiliser simplement une expression sans aucune donnée du fichier de données. Vous pouvez résoudre ce problème en définissant ID comme une expression (ou une séquence dans ce cas)

ID EXPRESSION "ID_SEQ.nextval" 

ou

ID SEQUENCE(count) 

Voir: http://docs.oracle.com/cd/B28359_01/server.111/b28319/ldr_field_list.htm#i1008234 pour toutes les options

0

J'ai eu problème similaire quand j'avais beaucoup d'enregistrements supplémentaires dans le fichier csv avec des valeurs vides.Si j'ouvrir le fichier csv dans le bloc-notes puis les lignes vides ressemble à ceci: ,,,, ,,,, ,,,, ,,,,

Vous ne pouvez pas voir les si elle est ouverte dans Excel. S'il vous plaît vérifier dans le bloc-notes et supprimer ces enregistrements