Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Outils > SQL*Loader
SQL*Loader Forum d'entraide sur Oracle SQL*Loader
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/08/2006, 12h54   #1
Invité régulier
 
Inscription : juin 2004
Messages : 49
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 49
Points : 6
Points : 6
Envoyer un message via Yahoo à Fiora
Par défaut Sql Loader - probleme de chargement de la valeur espace ' '

Bonjour,
voila mon probleme: je veux charger une valeur espace (vide) dans une colonne not null
Sql loader considère que c'est un champs null, et la colonne consernée elle peut pas etre null
quelqu'un peut m'aider svp
Fiora est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 14h10   #2
Membre actif
 
Inscription : novembre 2004
Messages : 311
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 311
Points : 157
Points : 157
Bonjour,

Peut on connaitre votre version d'Oracle ainsi que le contenu de votre fichier de controle ?
davy.g est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 14h33   #3
Invité régulier
 
Inscription : juin 2004
Messages : 49
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 49
Points : 6
Points : 6
Envoyer un message via Yahoo à Fiora
version Oracle 9.2.0

mon fichier de control est comme suit:
LOAD DATA
Append
INTO TABLE COUNTRY
FIELDS TERMINATED BY ";" OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS

(

COUNTRY_ID
, ISO
, NAME
, COUNTRY_CODE
, COUNTRY_DEF
, ENTRYDATE DATE "DD/MM/YYYY HH24:MI:SS"
......
)

Merci
Fiora est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 14h39   #4
Invité régulier
 
Inscription : juin 2004
Messages : 49
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 49
Points : 6
Points : 6
Envoyer un message via Yahoo à Fiora
J'ajoute juste ke je passe le fichier data en ligne de commande, voici un exemple des ligne de ce fichier :
12;GUF;FRENCH GUIANA;254; ;05/02/1998 14:54:05;0;254;254 ................

mon problème c'est que je veux charger la valeur du 5eme champs de cette ligne sur la colonne : COUNTRY_DEF
cette colonne ne peut être null

le message d'erreur est le suivant:
ORA-01400: cannot insert NULL into ("SYSADM"."COUNTRY"."COUNTRY_DEF")

merci
Fiora est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 14h40   #5
Membre actif
 
Inscription : novembre 2004
Messages : 311
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 311
Points : 157
Points : 157
Voila ce que dit la doc :
Citation:
Loading Trailing Blanks with Delimiters
Trailing blanks are not loaded with nondelimited datatypes unless you specify PRESERVE BLANKS. If a data field is 9 characters long and contains the value DANIELbbb, where bbb is three blanks, it is loaded into the Oracle database as "DANIEL" if declared as CHAR(9).

If you want the trailing blanks, you could declare it as CHAR(9) TERMINATED BY ':', and add a colon to the datafile so that the field is DANIELbbb:. This field is loaded as "DANIEL ", with the trailing blanks. You could also specify PRESERVE BLANKS without the TERMINATED BY clause and obtain the same results.
Essaye de placer le mot clé PRESERVE BLANKS
davy.g est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 14h45   #6
Membre actif
 
Inscription : novembre 2004
Messages : 311
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 311
Points : 157
Points : 157
Merci pour l'exemple de ligne à insérer !!!

Dans ce cas, ca ne marchera pas car votre colonne n'est pas délimitée par de simple côtes dans le fichier de données et ne représente aucune valeur particulière !!!

Il vous faut utiliser le mot clé CONSTANT :

Citation:
CONSTANT Parameter
To set a column to a constant value, use CONSTANT followed by a value:

CONSTANT value

CONSTANT data is interpreted by SQL*Loader as character input. It is converted, as necessary, to the database column type.

You may enclose the value within quotation marks, and you must do so if it contains whitespace or reserved words. Be sure to specify a legal value for the target column. If the value is bad, every record is rejected.

Numeric values larger than 2^32 - 1 (4,294,967,295) must be enclosed in quotation marks.


--------------------------------------------------------------------------------
Note:
Do not use the CONSTANT parameter to set a column to null. To set a column to null, do not specify that column at all. Oracle automatically sets that column to null when loading the record. The combination of CONSTANT and a value is a complete column specification.

davy.g est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 14h52   #7
Membre actif
 
Inscription : novembre 2004
Messages : 311
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 311
Points : 157
Points : 157
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
LOAD DATA
Append
INTO TABLE COUNTRY
FIELDS TERMINATED BY ";" OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS 

( 

COUNTRY_ID
, ISO
, NAME
, COUNTRY_CODE
, COUNTRY_DEF CONSTANT ' '
, ENTRYDATE DATE "DD/MM/YYYY HH24:MI:SS"
......
)
davy.g est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 14h53   #8
Invité régulier
 
Inscription : juin 2004
Messages : 49
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 49
Points : 6
Points : 6
Envoyer un message via Yahoo à Fiora
PRESERVE BLANKS au niveau de fichier de controle ça marche pas, problème de syntaxe

pour le CONSTANT, je crois pas que ça va marcher, parce que ma ligne peut contenir d'autre valeur comme ci-dessou:

81;DMA;DOMINICA;212;X;20/10/2003 17:38:47;0;212;.............


je vais essayé la troisième proposition, celle avec TERMINITED BY !!
Fiora est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 15h01   #9
Membre actif
 
Inscription : novembre 2004
Messages : 311
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 311
Points : 157
Points : 157
AH !!!!

Ca serait bien de ne pas dévoiler vos différentes cas au fur et à mesure pcq là on va pas s'en sortir !!!

Donc, je pense qu'il y a un problème dans l'énoncé !!!
Votre fichier en entrée peut contenir ou NON une valeur pour cette colonne et votre colonne est définie en NOT NULL dans votre table !!!

Donc, essayer d'utiliser la fonction DECODE ou NVL !!!!!
davy.g est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 15h03   #10
Membre actif
 
Inscription : novembre 2004
Messages : 311
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 311
Points : 157
Points : 157
Ou alors la fonction REPLACE
davy.g est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/08/2006, 15h13   #11
Invité régulier
 
Inscription : juin 2004
Messages : 49
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 49
Points : 6
Points : 6
Envoyer un message via Yahoo à Fiora
excuse ! pour le deuxième cas !

j'ai essayé avec :
, COUNTRY_DEF "NVL(:COUNTRY_DEF,' ')"

est ça marche

Merci bcp pour ton Aide
Fiora est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2006, 09h30   #12
Membre du Club
 
Inscription : mars 2005
Messages : 277
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 277
Points : 42
Points : 42
à part cette solution
est il possible , de parameter oracle pour pouvoir inserer un champ à '' dans un champs qui à la contrainte not null ?
Melvine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2006, 09h50   #13
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
si c'est un varchar, '' et null c'est la même chose (tiens j'ai l'impression d'avoir déja dit ça y'a pas longtemps.... )
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2006, 09h57   #14
Membre du Club
 
Inscription : mars 2005
Messages : 277
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 277
Points : 42
Points : 42
donc c'est impossible d'y remedier
Melvine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2006, 11h26   #15
Membre du Club
 
Inscription : mars 2005
Messages : 277
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 277
Points : 42
Points : 42
Par défaut Non Resolu .

Personne ne voit
Melvine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2006, 11h39   #16
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
si tu veux mettre un champ null dans un champ avec une contrainte not-null, le plus simple est d'enlever la contrainte!... c'est un peu comme si essayais de mettre des valeurs en double dans un champ avec une contrainte unique...
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2006, 12h48   #17
Membre du Club
 
Inscription : mars 2005
Messages : 277
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 277
Points : 42
Points : 42
en gros c'est eviter le probleme sans le resourdre
parceque NULL c'est different de '' mais apparament il n'y a qu'oracle qui ne gere pas ça.
c'est de la daube
Melvine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2006, 13h27   #18
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
Ben, ça a toujours été implémenté comme ça. Après, c'est un débat philosophique. Une chaine variable peut être considérée comme une suite d'informations de type "caractère". Lorsque cette chaine est de longueur nulle, c'est qu'il n'y a pas d'information ce qui est exactement la définition de NULL.

C'est vrai que cette équivalence peut être génante, mais c'est parfois l'inverse qui l'est. Sur sybase par exemple, on peu inserer effectivement des chaines vides sur des champs qui ont la contrainte not null. Et bien c'est souvent trés pénible, car on ne peu pas faire facilement de vérification qu'une chaine a bien quelque chose à l'intérieur avant de l'inserer. Il faut à chaque fois traiter les null ET les chaines vides, ce qui dans un fichier de load veux souvent dire la même chose...
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2007, 14h03   #19
Invité de passage
 
Inscription : décembre 2007
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 6
Points : 2
Points : 2
Par défaut utilise "nvl"

si t'as colonne est vide il faut interpréter ce résultat en base :
- si c'est un char : en base on doit avoir ' ' (donc un espace)
- si c'est un integer : en base on doit avoir un '0'

donc ca donne ca (exemple avec deux champs): noter que le champ à charger devient un champ à calculer.


TRUNCATE
INTO TABLE --
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
(
--field from file
a BOUNDFILLER,
b BOUNDFILLER,
--field calculated
COUNTRY CHAR "nvl (:a,' ')",
BO_ID_CUST INTEGER EXTERNAL "nvl(:b,0)"
)
reeds95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2007, 16h07   #20
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Citation:
Envoyé par remi4444 Voir le message
Ben, ça a toujours été implémenté comme ça. Après, c'est un débat philosophique. Une chaine variable peut être considérée comme une suite d'informations de type "caractère". Lorsque cette chaine est de longueur nulle, c'est qu'il n'y a pas d'information ce qui est exactement la définition de NULL.

C'est vrai que cette équivalence peut être génante, mais c'est parfois l'inverse qui l'est. Sur sybase par exemple, on peu inserer effectivement des chaines vides sur des champs qui ont la contrainte not null. Et bien c'est souvent trés pénible, car on ne peu pas faire facilement de vérification qu'une chaine a bien quelque chose à l'intérieur avant de l'inserer. Il faut à chaque fois traiter les null ET les chaines vides, ce qui dans un fichier de load veux souvent dire la même chose...
En fait la documentation Oracle dit que cette situation de confusion entre NULL et chaîne vide va changer dans une version future ...

Nous attendons alors

Michel
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h16.


 
 
 
 
Partenaires

Hébergement Web