web-dev-qa-db-fra.com

Oracle sqlldr TRAILING NULLCOLS requis, mais pourquoi?

J'ai un problème abstruse sqlldr 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"
)

Les données ressemblent à ceci:

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

Si je ne mets pas le TRAILING NULLCOLS dans, je reçois l'erreur "colonne introuvable avant la fin de l'enregistrement logique". Mais bien que certaines des colonnes soient nuls, les virgules sont toutes présentes; je ne vois donc aucune raison pour que sqlldr interprète mal le fichier d'entrée et n'atteigne pas la fin où il génère l'ID à partir de la séquence de base de données.

Cette syntaxe fonctionnait auparavant sans colonnes NULL. Pourquoi une colonne NULL fait-elle en sorte que sqlldr n'atteigne pas la colonne générée?

Je le fais fonctionner, je veux juste comprendre POURQUOI!?!

16
orbfish

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 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 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 chargée correctement contient 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 manque quelque chose ...

J'utilise 10gR2.

14
DCookie

La dernière colonne de votre fichier d’entrée doit contenir des données (qu’il s’agisse d’espace ou de caractère, mais pas de valeur nulle). J'imagine que le 1er enregistrement contient null après le dernier ',' que sqlldr ne reconnaîtra pas sauf demande spécifique de reconnaître les nulls à l'aide de l'option TRAILING NULLCOLS . Sinon, si vous ne souhaitez pas utiliser TRAILING NULLCOLS, vous devrez soin de ces NULL avant de transmettre le fichier à sqlldr . J'espère que cela vous aidera

3
juzz4fun

Le problème ici est que vous avez défini l'ID en tant que champ dans votre fichier de données alors que vous souhaitez simplement utiliser 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

3
Chris

Essayez de donner 5 ',' dans chaque ligne, similaire à la ligne 4.

0
ram

J'ai eu le même problème quand j'avais beaucoup d'enregistrements supplémentaires dans un fichier csv avec des valeurs vides. Si j’ouvre le fichier csv dans le bloc-notes, les lignes vides ressemblent à ceci:

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

0
WizzArt