Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
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 10/05/2007, 13h37   #1
Membre habitué
 
Avatar de PoichOU
 
Homme PoichOU
Étudiant
Inscription : juillet 2006
Messages : 296
Détails du profil
Informations personnelles :
Nom : Homme PoichOU
Âge : 24
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2006
Messages : 296
Points : 114
Points : 114
Par défaut Insertion multiple sous Oracle

Bonjour,

je voudrais faire une insertion multiple sous Oracle, est-ce possible ?

j'ai testé la commande spécifiée danc le tutoriel http://sql.developpez.com/sqlaz/dml/#L1.2 mais sans succès.

Quelqu'un à déjà fait ça ?

PoichOU
PoichOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2007, 13h50   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Non pas sous oracle.
tu peux faire un
Code :
INSERT INTO TABLE(col1, col2) SELECT c1, c2 FROM ....
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2007, 13h56   #3
Membre habitué
 
Avatar de PoichOU
 
Homme PoichOU
Étudiant
Inscription : juillet 2006
Messages : 296
Détails du profil
Informations personnelles :
Nom : Homme PoichOU
Âge : 24
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2006
Messages : 296
Points : 114
Points : 114
les données que je veux insérer ne sont pas déjà stockée en base, je ne peux donc pas faire
Code :
INSERT INTO TABLE(col1, col2) SELECT c1, c2 FROM ...
mon but est d'insérer des données provenant d'un fichier excel dans une table. J'ai donc beaucoup de ligne, n'y a t-il pas un moyen d'éviter de faire une requête insert par ligne ?
PoichOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2007, 13h58   #4
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

Il y a le sqlloader ou utl_file
http://jaouad.developpez.com/sqlldr/
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2007, 15h54   #5
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
sûr que sql load est une bonne approche. Techniquement, tu pourrais essayer :

Code :
1
2
3
4
5
 
CREATE TABLE t(x number,y number);
 
INSERT ALL INTO t VALUES (1,1) INTO t VALUES (2,2) INTO t VALUES (3,3) 
SELECT 'x' FROM dual;
quel est ton problème avec un insert par ligne ?
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2007, 16h32   #6
Membre habitué
 
Avatar de PoichOU
 
Homme PoichOU
Étudiant
Inscription : juillet 2006
Messages : 296
Détails du profil
Informations personnelles :
Nom : Homme PoichOU
Âge : 24
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2006
Messages : 296
Points : 114
Points : 114
mon problème est que j'ai 100 000 lignes !


j'ai testé ta méthode, elle marche !

J'ai donc construit une super requête avec toutes mes lignes à insérer, le seul problème c'est qu'il me fait un message d'erreur :

Code :
ORA-24335: nombre de colonnes acceptées LIMITé à 1000
Y a t -il une parade ?
PoichOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2007, 16h45   #7
Membre éclairé
 
Inscription : novembre 2002
Messages : 533
Détails du profil
Informations forums :
Inscription : novembre 2002
Messages : 533
Points : 359
Points : 359
1/ merci de préciser la version d'oracle
2/ tu as la solution des tables externes qui peut largement être envisagée si tu es au moins en 9i. Tu transformes ton fichier excel en CSV et le tour est joué.
Je t'invite à rechercher EXTERNAL TABLE sur le forum
3/ Sinon comme cela a déjà été dit SQL*Loader seras ton ami

@
__________________
PpPool
PpPool est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2007, 16h58   #8
Membre habitué
 
Avatar de PoichOU
 
Homme PoichOU
Étudiant
Inscription : juillet 2006
Messages : 296
Détails du profil
Informations personnelles :
Nom : Homme PoichOU
Âge : 24
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2006
Messages : 296
Points : 114
Points : 114
1/ la version d'oracle est : Oracle9i Release 9.2.0.6.0

2/ et 3/ il me semble que dans ces 2 cas je dois créer un fichier csv sur le serveur de base de données. Je ne suis pas admin et je n'ai auncun accès au serveur de base de données, je suis juste utilisateur.


PoichOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2007, 10h11   #9
Membre actif
 
Homme Bertrand
Administrateur de base de données
Inscription : mai 2007
Messages : 126
Détails du profil
Informations personnelles :
Nom : Homme Bertrand
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Conseil

Informations forums :
Inscription : mai 2007
Messages : 126
Points : 159
Points : 159
Bonjour,

Peux être pourrais tu créer ta table externe sur une base locale et y accéder par un dblink.

Sinon pour le probléme de limitation de colonnes, scinde la requête.

Cdt
deadoralive est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2007, 14h28   #10
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
pour sqlloader, tu n'as pas besoin d'avoir de fichier sur le serveur, sqlloader fonctionne comme sqlplus avec un client oracle
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 09h45   #11
Membre expérimenté
 
Avatar de jmnicolas
 
Homme
Développeur informatique
Inscription : juin 2007
Messages : 299
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Transports

Informations forums :
Inscription : juin 2007
Messages : 299
Points : 525
Points : 525
Bon j'ai rencontré le même problème et ai trouvé la solution, c'est pourquoi je me permet de remonter ce vieux sujet.
Vu qu'il apparait en bonne place dans Google, ça pourra sans doute servir.

J'utilisais la méthode de laurentschneider dans une transaction lancée par un programme CSharp :

Code :
1
2
3
4
CREATE TABLE t(x number,y number);
 
INSERT ALL INTO t VALUES (1,1) INTO t VALUES (2,2) INTO t VALUES (3,3) 
SELECT 'x' FROM dual;
et obtenait l'erreur ORA-24335 quand j'avais trop de données. En fait cette méthode d'insertion est à réserver quand on veut insérer dans des tables multiples.

Quand on veut insérer dans une seule table il faut utiliser :

Code :
1
2
3
4
5
INSERT INTO TABLE (column1, column2)
SELECT value1, value2 FROM DUAL UNION ALL
SELECT value1, value2 FROM DUAL UNION ALL
...etc...
SELECT value1, value2 FROM DUAL ;
__________________
The greatest shortcoming of the human race is our inability to understand the exponential function. Albert A. Bartlett

La plus grande lacune de la race humaine c'est notre incapacité à comprendre la fonction exponentielle.
jmnicolas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 11h13   #12
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
Citation:
Envoyé par jmnicolas Voir le message
J'utilisais la méthode de laurentschneider dans une transaction lancée par un programme CSharp :

Code :
1
2
3
4
CREATE TABLE t(x number,y number);
 
INSERT ALL INTO t VALUES (1,1) INTO t VALUES (2,2) INTO t VALUES (3,3) 
SELECT 'x' FROM dual;
et obtenait l'erreur ORA-24335 quand j'avais trop de données. En fait cette méthode d'insertion est à réserver quand on veut insérer dans des tables multiples.
étonnant, chez moi ça marche parfaitement
Code :
1
2
3
4
5
6
7
8
SQL> CREATE TABLE t(x number,y number);
 
TABLE created.
 
SQL> INSERT ALL INTO t VALUES (1,1) INTO t VALUES (2,2) INTO t VALUES (3,3)
  2  SELECT 'x' FROM dual;
 
3 rows created.
Quelle est ta version?
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 11h42   #13
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 695
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 695
Points : 10 465
Points : 10 465
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
La restriction vient d'ici :
Citation:
Envoyé par jmnicolas Voir le message
quand j'avais trop de données
Si on se réfère à la documentation Oracle :
Citation:
In a multitable insert, all of the insert_into_clauses cannot combine to specify more than 999 target columns.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 11h45   #14
Membre habitué
 
Avatar de PoichOU
 
Homme PoichOU
Étudiant
Inscription : juillet 2006
Messages : 296
Détails du profil
Informations personnelles :
Nom : Homme PoichOU
Âge : 24
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Étudiant
Secteur : Associations - ONG

Informations forums :
Inscription : juillet 2006
Messages : 296
Points : 114
Points : 114
Hello à tous (des années après )

comme j'avais indiqué dans mon dernier post cette méthode fonctionne bien mais il y a effectivement une limitation (à 999 ou 1000).

Personnellement j'avais contourné le problème en faisant plusieurs requêtes

PoichOU
PoichOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 13h00   #15
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
ça me rappelle un peu :
http://laurentschneider.com/wordpres...n-a-query.html
Code :
1
2
perl -e 'print("select ".(("1,"x50 ."\n")x200)."1 from dual;\n")'|
  sqlplus -s -L scott/tiger
Bon, si tu as des milliers de valeurs à entrer en une seule transaction, mieux vaut une table intermédiaire qu'une commande à s'arracher les yeux

Code :
1
2
3
4
5
6
7
CREATE global TEMPORARY TABLE temp(x number);
INSERT INTO temp VALUES(1);
INSERT INTO temp VALUES(2);
--  ..
INSERT INTO temp VALUES(999999);
INSERT INTO yourtable SELECT * FROM temp;
commit;
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider 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 03h34.


 
 
 
 
Partenaires

Hébergement Web