|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Doctorant Inscription : novembre 2011 Messages : 7 ![]() |
Bonjour à toutes et tous,
J'ai rencontré le souci suivant lors de l'export puis import d'une table via SQL Developer. Suite à l'exposé du problème j'expliquerais l'hypothèse que j'ai pu formuler quant au "pourquoi?". Si à tout hasard vous aviez un meilleur "pourquoi?" voire un "comment?" vous feriez de moi le plus heureux des newbies sur ce forum J'ai donc une table que je souhaite exporter depuis Oracle pour l'importer sur une autre connexion (Oracle également). J'ai essayé avec plusieurs formats d'export mais mettons que je décharge ma table depuis la connexion A en .tsv, fichiers distincts. Sous la connexion B je lance le script de création de table, une fois celle-ci créée je clique-droit dessus>Import data. Je vérifie les définitions des champs, leurs correspondances, tout semble OK, je lance la manip' et horreur: "Erreur: ORA-12899 valeur trop grande pour la colonne MON_SCHEMA.MA_TABLE.MA_COLONNE (réelle : 31, maximum : 30)". Cette erreur se produit sur plusieurs champs (mais pas tous) de types variés (VARCHAR, DATE, NUMBER). En poursuivant la requête malgré les erreurs je constate que la différence de taille de chaîne (=réelle-maximum) n'excède pas les 5 ou 6 caractères. Je me dis que le logiciel fait une estimation des tailles de champs sur les premiers enregistrements, je fais donc un MAX(LENGTH()) sur tous mes champs: les valeurs renvoyées correspondent bien aux définitions de champs fournies par Oracle lors du déchargement. En y pensant en l'air je me dis qu'il est possible que certains caractères "prennent plus de place" dans le format d'export (ajout de caractères d'échappement pour les éventuels séparateurs contenus dans les champs, transformation des caractères spéciaux sous une forme moins ambigüe mais plus longue...). Toujours est-il que de ne pas retomber sur mes pieds d'Oracle à Oracle me rend un peu chagrin (si Oracle modifie les données en export, pourquoi ne fait-il pas l'opération inverse lors de l'import?) et que surtout, pendant ce temps là, ben il n'y a rien qui est fait ^^. Merci par avance pour votre attention et éventuels éléments de réponses. Merci aussi à la communauté qui, sans le savoir, m'a souvent tiré de l'ornière auparavant. Bien à vous, H. |
|
|
00
|
|
|
#2 | ||
![]() ![]() |
Vous avez probablement vu juste.
Quel est le résultat de cette requête sur les deux environnements ? Code :
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#3 |
|
Invité de passage
![]() Doctorant Inscription : novembre 2011 Messages : 7 ![]() |
Bonjour Waldar,
Merci beaucoup pour votre réaction Dans l'environnement source (A) la requête renvoie: PARAMETER VALUE NLS_CHARACTERSET AL32UTF8 NLS_LENGTH_SEMANTICS BYTE PARAMETER VALUE NLS_CHARACTERSET AL32UTF8 NLS_LENGTH_SEMANTICS BYTE J'espère que cela pourra vous éclairer. Je suppose cependant que la solution aurait été plus simple si la requête avait renvoyé des valeurs différentes dans chaque environnement? ~^ Cordialement, H. |
|
|
00
|
|
|
#4 | ||
![]() ![]() |
Pas nécessairement, déjà vous êtes sur un character_set multibytes ça permet donc de poursuivre dans cette voie.
Je vous ai fait regarder le paramètre par défaut, mais celui-ci est contournable dans le script de création des tables. Qu'il faut donc regarder : Code :
__________________
Email : http://scr.im/waldar |
||
|
00
|
|
|
#5 |
|
Invité de passage
![]() Doctorant Inscription : novembre 2011 Messages : 7 ![]() |
Dans l'environnement source:
USERNAME TABLE_SOURCE AUTCOMINF B VARCHAR2 USERNAME TABLE_SOURCE AUTCOMEP C VARCHAR2 USERNAME TABLE_SOURCE AUTBASEP C VARCHAR2 USERNAME TABLE_SOURCE AUTBASINF B VARCHAR2 USERNAME TABLE_SOURCE GENRE C VARCHAR2 USERNAME TABLE_SOURCE CODTAXIN B VARCHAR2 USERNAME TABLE_SOURCE FAMILLE B VARCHAR2 USERNAME TABLE_SOURCE ESPECE C VARCHAR2 USERNAME TABLE_SOURCE NOMINFSP C VARCHAR2 USERNAME TABLE_SOURCE PARTS B VARCHAR2 USERNAME TABLE_SOURCE SECTEUR B VARCHAR2 USERNAME TABLE_SOURCE LOC C VARCHAR2 USERNAME TABLE_SOURCE COD_BOT_TDWG B VARCHAR2 USERNAME TABLE_SOURCE COD_UB_TDWG B VARCHAR2 USERNAME TABLE_SOURCE NOMLOC C VARCHAR2 USERNAME TABLE_SOURCE PRES_XY C VARCHAR2 USERNAME TABLE_SOURCE P_NUM_REC C VARCHAR2 USERNAME TABLE_SOURCE UNIT_ALT B VARCHAR2 USERNAME TABLE_SOURCE UNIT_POLINF C VARCHAR2 USERNAME TABLE_SOURCE UNIT_POLSUP B VARCHAR2 USERNAME TABLE_SOURCE CONTINENT C VARCHAR2 USERNAME TABLE_SOURCE DATCOMPL C VARCHAR2 USERNAME TABLE_SOURCE PAY B VARCHAR2 USERNAME TABLE_SOURCE NOT C VARCHAR2 USERNAME TABLE_SOURCE COD_ISO B VARCHAR2 USERNAME TABLE_SOURCE DESC B VARCHAR2 Et dans l'environnement cible: USERNAME TABLE_CIBLE AUTCOMINF B VARCHAR2 USERNAME TABLE_CIBLE AUTCOMEP C VARCHAR2 USERNAME TABLE_CIBLE AUTBASEP C VARCHAR2 USERNAME TABLE_CIBLE AUTBASINF B VARCHAR2 USERNAME TABLE_CIBLE CODTAXIN B VARCHAR2 USERNAME TABLE_CIBLE FAMILLE B VARCHAR2 USERNAME TABLE_CIBLE ESPECE C VARCHAR2 USERNAME TABLE_CIBLE GENRE C VARCHAR2 USERNAME TABLE_CIBLE NOMINFSP C VARCHAR2 USERNAME TABLE_CIBLE PARTS B VARCHAR2 USERNAME TABLE_CIBLE SECTEUR B VARCHAR2 USERNAME TABLE_CIBLE LOC C VARCHAR2 USERNAME TABLE_CIBLE COD_BOT_TDWG B VARCHAR2 USERNAME TABLE_CIBLE COD_UB_TDWG B VARCHAR2 USERNAME TABLE_CIBLE NOMLOC C VARCHAR2 USERNAME TABLE_CIBLE PRES_XY C VARCHAR2 USERNAME TABLE_CIBLE P_NUM_REC C VARCHAR2 USERNAME TABLE_CIBLE UNIT_ALT B VARCHAR2 USERNAME TABLE_CIBLE UNIT_POLINF C VARCHAR2 USERNAME TABLE_CIBLE UNIT_POLSUP B VARCHAR2 USERNAME TABLE_CIBLE CONTINENT C VARCHAR2 USERNAME TABLE_CIBLE DAT_COMPL C VARCHAR2 USERNAME TABLE_CIBLE PAY B VARCHAR2 USERNAME TABLE_CIBLE NOT C VARCHAR2 USERNAME TABLE_CIBLE COD_ISO B VARCHAR2 USERNAME TABLE_CIBLE DESC B VARCHAR2 Si cela peut aider également, parmi les "valeurs" qui "dépassent", il y a des NULL ce qui me semble aberrant mais fera peut être du sens dans ce cas précis. Encore merci pour votre aide, H. P.S. Je n'aurais plus accès aux environnements d'ici demain matin (et donc hélàs difficile de les interroger d'ici là). |
|
|
00
|
|
|
#6 |
![]() ![]() |
J'ai oublié de mettre les longueurs dans ma requête, enfin j'imagine que ce sont les mêmes.
Effectivement, tout mettre en varchar2(2000), ce n'est pas ce qu'il y a de mieux, on essaie d'ajuster.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#7 | ||
|
Invité de passage
![]() Doctorant Inscription : novembre 2011 Messages : 7 ![]() |
Du coup j'ai lancé la requête suivante:
Code :
USERNAME TABLE_SOURCE AUTCOMINF B VARCHAR2 70 USERNAME TABLE_SOURCE AUTCOMEP C VARCHAR2 320 USERNAME TABLE_SOURCE AUTBASEP C VARCHAR2 120 USERNAME TABLE_SOURCE AUTBASINF B VARCHAR2 70 USERNAME TABLE_SOURCE CODTAXIN B VARCHAR2 7 USERNAME TABLE_SOURCE FAMILLE B VARCHAR2 30 USERNAME TABLE_SOURCE ESPECE C VARCHAR2 120 USERNAME TABLE_SOURCE GENRE C VARCHAR2 120 USERNAME TABLE_SOURCE NOMINFSP C VARCHAR2 120 USERNAME TABLE_SOURCE PARTS B VARCHAR2 30 USERNAME TABLE_SOURCE SECTEUR B VARCHAR2 3 USERNAME TABLE_SOURCE LOC C VARCHAR2 920 USERNAME TABLE_SOURCE COD_BOT_TDWG B VARCHAR2 3 USERNAME TABLE_SOURCE COD_UB_TDWG B VARCHAR2 2 USERNAME TABLE_SOURCE NOMLOC C VARCHAR2 200 USERNAME TABLE_SOURCE PRES_XY C VARCHAR2 8 USERNAME TABLE_SOURCE P_NUM_REC C VARCHAR2 20 USERNAME TABLE_SOURCE UNIT_ALT B VARCHAR2 2 USERNAME TABLE_SOURCE UNIT_POLINF C VARCHAR2 200 USERNAME TABLE_SOURCE UNIT_POLSUP B VARCHAR2 50 USERNAME TABLE_SOURCE CONTINENT C VARCHAR2 100 USERNAME TABLE_SOURCE DATCOMPL C VARCHAR2 100 USERNAME TABLE_SOURCE PAY B VARCHAR2 90 USERNAME TABLE_SOURCE NOT C VARCHAR2 4000 USERNAME TABLE_SOURCE COD_ISO B VARCHAR2 2 USERNAME TABLE_SOURCE DESC B VARCHAR2 250 USERNAME TABLE_CIBLE AUTCOMINF B VARCHAR2 70 USERNAME TABLE_CIBLE AUTCOMEP C VARCHAR2 320 USERNAME TABLE_CIBLE AUTBASEP C VARCHAR2 120 USERNAME TABLE_CIBLE AUTBASINF B VARCHAR2 70 USERNAME TABLE_CIBLE COD_TAXIN B VARCHAR2 7 USERNAME TABLE_CIBLE FAMILLE B VARCHAR2 30 USERNAME TABLE_CIBLE ESPECE C VARCHAR2 120 USERNAME TABLE_CIBLE GENRE C VARCHAR2 120 USERNAME TABLE_CIBLE NOMINFSP C VARCHAR2 120 USERNAME TABLE_CIBLE PARTS B VARCHAR2 30 USERNAME TABLE_CIBLE SECTEUR B VARCHAR2 3 USERNAME TABLE_CIBLE LOC C VARCHAR2 920 USERNAME TABLE_CIBLE COD_BOT_TDWG B VARCHAR2 3 USERNAME TABLE_CIBLE COD_UB_TDWG B VARCHAR2 2 USERNAME TABLE_CIBLE NOMLOC C VARCHAR2 200 USERNAME TABLE_CIBLE PRES_XY C VARCHAR2 8 USERNAME TABLE_CIBLE P_NUM_REC C VARCHAR2 20 USERNAME TABLE_CIBLE UNIT_ALT B VARCHAR2 2 USERNAME TABLE_CIBLE UNIT_POLINF C VARCHAR2 200 USERNAME TABLE_CIBLE UNIT_POLSUP B VARCHAR2 50 USERNAME TABLE_CIBLE CONTINENT C VARCHAR2 100 USERNAME TABLE_CIBLE DATCOMPL C VARCHAR2 100 USERNAME TABLE_CIBLE PAY B VARCHAR2 90 USERNAME TABLE_CIBLE NOT C VARCHAR2 4000 USERNAME TABLE_CIBLE COD_ISO B VARCHAR2 2 USERNAME TABLE_CIBLE DESC B VARCHAR2 250 Une idée? Cordialement, H. |
||
|
|
00
|
|
|
#8 |
![]() ![]() |
Bon ce n'est pas ça.
Il reste à regarder les formats d'export des données date et numérique (surtout les nombres décimaux). Pouvez-vous poster une seule ligne qui pose problème des données qui transitent ?
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#9 |
|
Invité de passage
![]() Doctorant Inscription : novembre 2011 Messages : 7 ![]() |
Bien sur, quelques-unes même (l'erreur se manifestant sur différents champs), sous quelle forme pour que ce soit lisible (environ 50 champs)?
Pour information j'avais ,avant d'identifier ce souci, les messages d'erreur suivant en cours d'import: Line XX contains invalid enclosed character or data delimiter. |
|
|
00
|
|
|
#10 | ||
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Le problème vient a priori du passage par fichier.
Donc une possibilité serait déjà de ne pas passer par ces fichiers N'est-il pas possible de faire un DBLink entre les 2 bases ? Cela te simplifierait grandement la vie ! Sinon, définir les longueurs de chaînes sur le nombre de caractères est plus compréhensible pour les développeurs / utilisateurs et évite ce genre de choses (on contrôle moins l'espace utilisé, of course, mais de toute façon dans le cas général ce n'est pas un problème) : Code :
|
||
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Doctorant Inscription : novembre 2011 Messages : 7 ![]() |
Bonjour Rei Ichido,
Effectivement un DBlink serait plus simple et sera probablement mis en place ultérieurement, suite à mon travail exploratoire (pas de bol, je sais ^^, j'aurais sans doute quitté les lieux d'ici là mais ça fera un argument de plus en faveur d'un DBlink, je ne manquerais pas de le faire savoir). Pas de FTP dans mon processus (ou bien à l'insu de mon plein gré), je décharge les tables dans "Mes documents" et les importe (enfin j'essaye) depuis ce même dossier. On m'a effectivement fait remarquer ce midi que j'avais probablement intérêt à spécifier mes tailles de champs en CHAR et non en BYTE (dans ce cas du moins, mais je note bien votre remarque à ce sujet et l'ajoute à ma liste de "bonnes pratiques à suivre"). Ces avis convergeant sont plutôt encourageants. Je teste ça en espérant vous fournir le fin mot de l'histoire dans mon prochain message. Merci à vous, H. |
|
|
00
|
|
|
#12 |
|
Invité de passage
![]() Doctorant Inscription : novembre 2011 Messages : 7 ![]() |
Après plus d'une heure de chargement (et d'angoisse)...ma table semble importée à peu près correctement
Dans quasiment tout les cas il a effectivement suffit de préciser que les longueurs de champs de type VARCHAR2 que je fournissais étaient en CHAR et non en BYTE. Petit holà cependant: avant de finaliser la préparation de l'import j'avais encore deux champs qui "dépassaient" tout deux théoriquement en CHAR(1). Après MAX(LENGTH()) , MAX(LENGTHB()) et tâtonnements j'ai pu poursuivre en fixant un champ en VARCHAR2(10) et l'autre en VARCHAR(2) alors que de toute évidence (voir ci-après) ils ne contiennent bien qu'un caractère chacun. Estimant qu'il était possible que pour des raisons d'encodage mes champs "sautent" j'ai fait une petite vérification simpliste après coup en faisant des SELECT DISTINCT sur les 2 champs concernés et les 4 champs les entourant présumant qu'en cas de perte de délimiteur je trouverais des valeurs plus folkloriques ou plus diverses entre la table d'origine et la table de destination. A priori pas de problèmes, de plus les deux tables comptabilisent le même nombre de lignes. A tout hasard si quelqu'un a une méthode de validation plus adaptée, je suis bien sur preneur Enfin il reste, je pense, quelque chose de pas très clair dans cet affaire aussi si cela peut être utile à une partie de la communauté (qui n'a pas de DBlink par exemple ^^) je me propose de prolonger la discussion avec les résultats de tests d'export/import sur des données restreintes (à savoir à partir des SELECT DISTINCT sur mes deux champs à problème) pour identifier le(s) valeur(s) à problème. Si cela est nécessaire merci de me dire quelles autres informations pourraient être utiles pour les futurs lecteurs. A tout hasard voici la liste des valeurs prises dans ces champs (hors NULL) si cela peut vous éclairer. Vous noterez en fin du champ ALT_PRECIS quelques valeurs dont on peut soupçonner qu'elles sont la cause de ces problèmes. Valeurs prises par ALT_PRECIS: 9 7 6 5 4 3 2 1 0 x f é e E c ~ ] ? > = < - & " 2 1 x w W v s S n m l f e E c C . Bien à vous, H. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com