2009-06-11 9 views
2

Pour charger des données (à partir d'un fichier CSV) dans une base de données Oracle, j'utilise SQL * Loader. Dans la table qui reçoit ces données, une colonne varchar2(500) est appelée COMMENTS. Pour certaines raisons, je veux ignorer cette information du fichier CSV. Ainsi, j'ai écrit ce fichier de contrôle:Comment vraiment sauter le traitement d'une colonne?

Options (BindSize=10000000,Readsize=10000000,Rows=5000,Errors=100) 
    Load Data 
    Infile 'XXX.txt' 
    Append into table T_XXX 
    Fields Terminated By ';' 
    TRAILING NULLCOLS 
(
    ... 
    COMMENTS FILLER, 
    ... 
) 

Ce code semble fonctionner correctement, que le champ COMMENTS dans la base de données est toujours à null.

Cependant, si dans mon fichier CSV j'ai un dossier où le champ COMMENTS correspondant dépasse la limite de 500 caractères, je reçois une erreur de SQL * Loader:

Record 2: Rejected - Error on table T_XXX, column COMMENTS. 
Field in data file exceeds maximum length 

est-il un moyen de vraiment exclure le traitement de mes champs COMMENTS?

Répondre

2

Je ne peux pas reproduire votre problème. J'utilise Oracle 10.2.0.3.0 avec SQL * Loader 10.2.0.1.

Voici mon cas de test:

SQL> CREATE TABLE test_sqlldr (
    2  ID NUMBER, 
    3  comments VARCHAR2(20), 
    4  id2 NUMBER 
    5 ); 

Table created 

fichier de contrôle:

LOAD DATA 
INFILE test.data 
INTO TABLE test_sqlldr 
APPEND 
FIELDS TERMINATED BY ';' 
TRAILING NULLCOLS 
(id, 
    comments filler, 
    id2 
) 

fichier de données:

1;aaa;2 
3;abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz;4 
5;bbb;6 

Je suis en utilisant la commande sqlldr userid=xxx/[email protected] control=test.ctl et que je reçois tous les les lignes sans erreurs:

SQL> select * from test_sqlldr; 

     ID COMMENTS     ID2 
---------- -------------------- ---------- 
     1        2 
     3        4 
     5        6 

Vous pouvez essayer une autre approche, je reçois le même résultat souhaité avec le fichier de contrôle:

LOAD DATA 
INFILE test.data 
INTO TABLE test_sqlldr 
APPEND 
FIELDS TERMINATED BY ';' 
TRAILING NULLCOLS 
(id, 
    comments "substr(:comments,1,0)", 
    id2 
) 

mise à jour suivant le commentaire de Romaintaz: J'ai regardé à nouveau et a réussi à obtenir le même erreur que vous lorsque la taille de la colonne dépasse 255 caractères. Cela est dû au fait que le type de données par défaut de SQL * Loader est char (255). Si vous avez une colonne avec plus de données, vous devrez spécifier la longueur. Le fichier de contrôle suivant a résolu le problème pour une colonne de 300 caractères:

LOAD DATA 
INFILE test.data 
INTO TABLE test_sqlldr 
APPEND 
FIELDS TERMINATED BY ';' 
TRAILING NULLCOLS 
(id, 
    comments filler char(4000), 
    id2 
) 

Hope this helps,

-
Vincent

+0

Merci pour votre aide. J'ai essayé avec la fonction substr, mais j'ai le même résultat. J'ai aussi beaucoup simplifié mon fichier de contrôle et de données (ce processus ne traite que PK et COMMENTAIRES), mais j'ai quand même l'erreur :( J'utilise la version loader 10.2.0.3.0 sql ... – romaintaz

+0

@Romaintaz: vous peut avoir un commentaire qui dépasse les caractères de 4 Ko. J'ai mis à jour ma réponse –

+0

@Vincent: Mon test ne contient qu'un COMMENTAIRE de 514 caractères ... Je suis donc loin d'atteindre la limite de 4 Ko. Je reçois toujours l'erreur, même avec "comments filler char (500)". – romaintaz

1

Juste pour suggérer une petite amélioration, vous pouvez essayer quelque chose comme :

LOAD DATA 
IN FILE test.data INTO TABLE test_sqlldr 
APPEND 
FIELDS TERMINATED BY ';'TRAILING NULLCOLS 
(
id, 
comments char(4000) "substr(:comments, 1, 200)", 
id2) 

Maintenant, vous allez saisir les 200 premiers caractères (ou n'importe quel nombre que vous spécifiez à sa place) de tous comme nts - à moins que certains de vos enregistrements d'entrée aient des valeurs pour le champ commentaires dépassant 4000 caractères, dans lesquelles ils seront rejetés par le chargeur avec l'erreur 'dépasse la longueur max' notée précédemment. Mais en supposant que cela soit rare ou non, tous les enregistrements seront chargés avec certains des commentaires tronqués à 200 caractères.

Si vous dépassez char(4000), vous obtiendrez une erreur SQL Loader - il y a une limite à laquelle vous pouvez pousser la bête.