|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : juin 2005 Messages : 11 ![]() |
Bonjour à tous,
J'ai un fichier plat que je dois charger dans Oracle 9i par un SQL Loader, dans une table qui contient un champ ID servant de clé primaire. Or dans mon fichier texte je n'ai pas de donnée pour ce champ. Pour plus de précisions, voici la structure de mon fichier : Champ1 X(8) Champ2 X(10) Champ3 N(10,2) Et la structure de ma table ID NUMBER, CH1 VARCHAR2(8), CH2 VARCHAR2(10), CH3 NUMBER(10,2) Ma question est donc : comment puis-je faire pour alimenter la colonne ID avec des valeurs s'incrémentant à chaque enregistrement ? Merci d'avance de votre aide. |
|
|
00
|
|
|
#2 | ||
|
Futur Membre du Club
![]() Étudiant Inscription : juillet 2006 Messages : 61 ![]() |
salut,
Code :
|
||
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : juin 2005 Messages : 11 ![]() |
Bonjour,
Effectivement j'avais pensé à quelque chose dans ce genre là, mais voilà, problème de taille (que j'ai oublié de signaler d'ailleurs, honte à moi ... de champ ID qui me sont imposés...)J'avais pensé à charger mes données via SQL Loader dans une table de travail, et de la faire un insert dans ma table définitive en remplissant mes ID par un SELECT ROWNUM, mais je voudrais quelque chose de plus "propre" qui m'éviterait de passer par une table intermédiaire... Merci en tous cas pour la réponse, en espérant qu'il y en aura d'autres. |
|
|
00
|
|
|
#4 |
|
Membre du Club
![]() Inscription : mars 2004 Messages : 98 ![]() |
Si tu as une sequence qui alimente le champ PK, tu peux rajouter cela dans ton fichier controle :
ID "taSequence.NEXTVAL" sans que le champ Id existe dans le fichier à charger. |
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : juin 2005 Messages : 11 ![]() |
Malheureusement non, je n'ai pas de séquence, tout le problème est là.... Et il faut que je la "simule" manuellement, puisque je n'ai pas le droit d'en créer...
Mais merci à toi d'avoir essayé de m'aider ! Si tu as d'autres idées, je suis preneur ! |
|
|
00
|
|
|
#6 |
|
Membre habitué
![]() Inscription : août 2006 Messages : 181 ![]() |
bonjour,
j'ai fait cet exemple qui pourra t'aider probablement : create table test (id number(3),ch varchar2(10)); insert into test values (0,''); insert into test (id,ch) values ((select max(id)+1 from test),'bb'); ... delete test where id=0 -- pour supprimer le premier élément sur lequel on c'est basé pour commencer l'incrementation |
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : juin 2005 Messages : 11 ![]() |
Merci de ton aide Oraman, mais cela ne répond pas à mon problème car :
- je pars d'un fichier pour le charger par SQL Loader - je ne peux donc pas utiliser de SQL Et si je dois en venir à une solution où je dois faire des inserts (donc en passant par une table intermédiaire sans ID), autant utiliser ROWNUM, ça me paraît plus "propre" que MAX + 1. |
|
|
00
|
|
|
#8 |
|
Nouveau Membre du Club
![]() Inscription : février 2006 Messages : 28 ![]() |
bonjour,
si tu as le droit de créer des fonction dans cette base de données cela résoudra ton problème, sinon il te restera mon avis, de créer un petit programme(script shell avec awk si tu utilise Unix) pour ajouter n caractères qui feront l'affaire d'une clé. salutations. |
|
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : juin 2005 Messages : 11 ![]() |
A priori je répondrais que oui, j'ai le droit de créer des fonctions, puisque je crée des procédures stockées.
Mais je ne vois pas bien où tu veux en venir avec une fonction ? Pour ce qui est su script Shell qui rajoute des caractères, effectivement ça peut être une idée... |
|
|
00
|
|
|
#10 | ||||
|
Nouveau Membre du Club
![]() Inscription : février 2006 Messages : 28 ![]() |
si tu as le droit de créer des fonctions il alors très simple de résoudre ce problème:
Code :
Code :
bon courage. |
||||
|
|
00
|
|
|
#11 | ||||
|
Invité de passage
![]() Inscription : juin 2005 Messages : 11 ![]() |
Merci pour l'idée Hadlak, j'ai essayé de mettre en place cela.
J'ai créé la fonction, et modifié mon control file comme cela : Code :
Code :
Je précise que j'utilise ce Loader depuis un script Shell qui : 1. execute un SQL PLUS pour créer ma table 2. Lancer le SQLLDR pour la charger 3. execute un autre SQL PLUS pour faire des updates Merci de votre aide. |
||||
|
|
00
|
|
|
#12 |
|
Nouveau Membre du Club
![]() Inscription : février 2006 Messages : 28 ![]() |
bonjour,
l'erreur ORA-01502 indique un accès à un index ou une partition(si la table est partitionné) qui marqué comme invalide. généralement le problème apparait avec sql loader et des opération DDL qui nécessitent beaucoup d'espace dans le tablespace temporaire. il est possible que tes enregistrement soit déjà charger mais oracle n'a pas pu seulement créer les index donc merci de :
|
|
|
00
|
|
|
#13 |
|
Invité de passage
![]() Inscription : juin 2005 Messages : 11 ![]() |
Bonjour hadlak,
Pour répondre à tes questions : - mes enregistrements ne sont pas chargés - je n'utilise aucun index sur ma table (même pas une clé ni une contrainte) - la requête de recherche des index invalides ne renvoie aucun enregistrement. Peut-être devrais-je faire un COMMIT dans le script SQLPLUS qui crée ma table (et qui est exécuté juste avant de charge les données par SQLLDR) ? En tous cas merci de ton aide. |
|
|
00
|
|
|
#14 |
|
Nouveau Membre du Club
![]() Inscription : février 2006 Messages : 28 ![]() |
le commit n'est pas nécessaire pour un create.
et l'espace dans le tablespace temporaire ? |
|
|
00
|
|
|
#15 |
|
Invité de passage
![]() Inscription : juin 2005 Messages : 11 ![]() |
Je n'y ai pas directement accès, je n'ai pas les privilèges suffisants pour voir les tablespaces.
Je contacte mon DBA tout de suite (enfin, si j'arrive à le joindre) ... I'll be back soon ! |
|
|
00
|
|
|
#16 |
|
Invité de passage
![]() Inscription : juin 2005 Messages : 11 ![]() |
Effectivement, mes Tablespaces d'index et Temp sont pleins...
CQFD. Merci à tous ceux qui m'ont répondu, et en particulier à Hadlak. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com