Oracle sqlldr traînant NULLCOLS requis, mais pourquoi?
j'ai un problème abstrait qui me dérange. Mon fichier de contrôle ressemble à ceci:
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 les NULLCOLS arrière, j'obtiens l'erreur "colonne introuvable avant la fin de l'enregistrement logique". Mais bien que certaines 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 à partir de la base de données de séquence.
cette syntaxe a déjà fonctionné avec aucune colonne nulle - pourquoi une colonne nulle empêche sqlldr d'atteindre la colonne générée?
Je l'ai fait fonctionner, je veux juste comprendre pourquoi!?!
5 réponses
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, à moins que la suite NULLCOLS ne soit spécifiée, 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 bref test. 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 le résultat suivant:
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.
noter que le seule la rangée correctement chargée avait 5 virgules. Même la 3e rangée, avec toutes les valeurs de données présentes sauf ID, les données ne se chargent pas. Sauf si je suis en manque de quelque chose...
j'utilise 10gR2.
Dernière colonne de votre fichier d'entrée doit disposer de certaines données (soit l'espace ou de char, mais pas nulle). Je suppose que le premier enregistrement contient null après le dernier ', ' que sqlldr ne reconnaîtra pas à moins qu'on lui demande spécifiquement de reconnaître les NULL en utilisant L'option des NULLCOLS traînants. Alternativement, si vous ne voulez pas utiliser les NULLCOLS traînants, vous devrez prendre soin de ces NULLs avant de passer le fichier à sqlldr. Espérons que cela aide
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
essayez de donner 5 ', ' dans chaque ligne, similaire à la ligne numéro 4.
j'ai eu le même problème quand j'ai eu beaucoup d'enregistrements supplémentaires dans le fichier csv avec des valeurs vides. Si j'ouvre un fichier csv dans notepad, les lignes vides ressemblent à ceci:: ,,,, ,,,, ,,,, ,,,,
vous ne pouvez pas les voir si elles sont ouvertes dans Excel. Veuillez cocher le bloc-notes et supprimer ces notices