|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre régulier
![]() Inscription : juin 2005 Messages : 260 ![]() |
Bonjour,
Je dois migrer d'une base de données Mysql à une base Oracle et je rencontre pas mal de problèmes dont un en particulier : J'utilisais, dans la version mysql, la commande load data local infile... Ce qui me permettait, à partir d'un PC client, de charger des informations préalablement insérée dans un fichier sur ce PC client. Or j'ai bien peur que ca ne soit pas possible avec Oracle d'après ce que j'ai trouvé sur le net. C'est cela ? Je précise que le client, à part les driver JDBC (donc un fichier .jar), n'a rien d'installer sur sa machine pour communiquer avec la base distante. Avez vous une idée de comment je peux faire s'il vous plait ? Merci d'avance. |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Inscription : mai 2004 Messages : 1 812 ![]() |
Bah tout en java ça doit être possible. Tu faisais comment avec mysql ? C'était un programme particulier en java qui ouvrait le fichier et appelait la commande load data local infile ? Tu risques effectivement de devoir ré-écrire une partie du code de la fonction toi même sous Oracle.
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes. Mon combat pour les droits des consommateurs face aux abus des grandes marques. |
|
|
00
|
|
|
#3 |
|
Membre régulier
![]() Inscription : juin 2005 Messages : 260 ![]() |
bah en fait je faisait une requete "load data local infile 'C:/fichier.txt' into table t_table"
ce qui chargeait automatiquement le fichier sur le serveur et inserait les infos dans la base. A la base, c'était pour gagner du temps et éviter de faire x requêtes, mais je vois mal comment faire sur oracle, sachant qu'on utilise juste les drivers JDBC. (j'ai lu qu'on pouvait le faire avec sql*loader mais on ne doit pas faire d'installation sur le PC client). Est-ce possible ? |
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() Inscription : février 2006 Messages : 3 433 ![]() |
Je pense que la seule solution avec un outil Oracle et sans programmation pour charger des données dans une base depuis une machine client est bien d'utiliser SQL*Loader.
Si le fichier peut être transféré sur le serveur qui héberge la base, alors vous pouvez forcément utiliser SQL*Loader, ou coder le chargement en PL/SQL avec le package UTL_FILE ou encore créer une table externe. |
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() Inscription : mai 2004 Messages : 1 812 ![]() |
Comme je le disais, tu risques de devoir ré-écrire une partie du code toi-même. Par exemple écrire une fonction java qui va ouvrir ton fichier et envoyer le contenu à une fonction Oracle que tu auras programmé et qui saura quoi en faire, ou alors écrire une fonction java qui va ouvrir ton fichier et qui insérera son contenu dans Oracle.
Bref rien d'évident et de natif, à mon avis. Evidemment si tu avais un moyen simple d'envoyer les fichiers de ton poste client sur un répertoire du serveur, SQL*Loader aurait été utilisable.
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes. Mon combat pour les droits des consommateurs face aux abus des grandes marques. |
|
|
00
|
|
|
#6 |
|
Membre régulier
![]() Inscription : juin 2005 Messages : 260 ![]() |
il se pourrait que j'en trouve un (j'utilise déjà une fonction similaire qui me permet de transmettre un fichier via un serveur web...)
je vais voir comment je peux faire. Merci pour vos réponses. |
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 024 ![]() |
Personnellement, je trouve que c'est pénible de devoir gérer des fichiers sur le serveur, car il y a une foule de nouveaux cas d'erreurs à traiter (problèmes de droits, problèmes réseaux etc...). Si le volume n'est pas tres important, alors tu peux toi meme générer une boucle d'insert en faisant tres attention à 2 choses:
- ne pas ouvrir/fermer la connexion à chaque occurence de boucle (si si j'ai vu des progiciels qui faisaient ça! )- utiliser les variable bind (requetes préparées avec "prepareStatement" avec les "?" dedans) Si vraiment tu as des gros problèmes de performances (mais quand meme ça m'etonnerait) tu peux envisager des solutions plus brutales comme le chargement du fichier en 1 seul coup dans un CLOB et traiter apres par des procédures stockées. |
|
|
00
|
|
|
#8 | |
|
Membre régulier
![]() Inscription : juin 2005 Messages : 260 ![]() |
Citation:
Les variables bind c'est des requêtes parametrées en fait ? Quand j'ai récuperé les sources du logiciel ce n'était pas fait... il faudrait que j'y pense, est-ce que ca influe vraiment sur les performances ? A savoir, je peux inserer jusqu'à, 3000 enregistrements d'un seul coup (au max. sinon c'est entre 50 et 500 en moyenne), contenu dans un seul fichier, c'est pour cela que cette solution a été choisie. Le problème est que en local, sur un serveur mysql, ca allait mais dès qu'on passait sur un serveur mysql distant... j'ose même pas en parler... La solution brutale pourrait être une solution mais ca me fait modifier beaucoup de choses pour une version oracle et en maintenance par la suite ... c'est pas l'idéal :/ Je dit pas trop de bêtises ? |
|
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() Inscription : avril 2006 Messages : 1 024 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#10 | ||||||
|
Membre régulier
![]() Inscription : juin 2005 Messages : 260 ![]() |
Oki.
Sinon j'ai essayé de prendre en main le sql*loader d'oracle, je n'arrive pas à inclure un champ selon la valeur d'une séquence dans le fichier de contrôle : Code :
Code :
Code :
|
||||||
|
|
00
|
|
|
#11 |
|
Membre expérimenté
![]() ![]() Inscription : décembre 2003 Messages : 480 ![]() |
c'est normal : tu veux remplir une table comprenant 7 colonnes et tu n'en fournis que six
je sais que la première tu veux la générer automatiquement mais dans ce cas tu dois utiliser le keyword SEQUENCE je n'ai pas d'exemple sous la main mais fait une recherche dans la doc (Utilities Guide) à "Using SQL*Loader to Generate Data for Input." bonne chance et bon réveillon (attention trop d'oracle nuit à la santé
__________________
*** OPN Exadata Specialist *** *** OCE Performance Tuning 11g *** *** OCE Rac 10g *** *** OCP DBA 9i-10g-11g *** |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com