IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Insertion multiple sous Oracle


Sujet :

Oracle

  1. #1
    Membre habitué Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Points : 161
    Points
    161
    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

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Non pas sous oracle.
    tu peux faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO TABLE(col1, col2) SELECT c1, c2 from ....

  3. #3
    Membre habitué Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Points : 161
    Points
    161
    Par défaut
    les données que je veux insérer ne sont pas déjà stockée en base, je ne peux donc pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  4. #4
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Salut,

    Il y a le sqlloader ou utl_file
    http://jaouad.developpez.com/sqlldr/

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  6. #6
    Membre habitué Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Points : 161
    Points
    161
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-24335: nombre de colonnes acceptées limité à 1000
    Y a t -il une parade ?

  7. #7
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    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

    @

  8. #8
    Membre habitué Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Points : 161
    Points
    161
    Par défaut
    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.



  9. #9
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 171
    Points
    171
    Par défaut
    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

  10. #10
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    pour sqlloader, tu n'as pas besoin d'avoir de fichier sur le serveur, sqlloader fonctionne comme sqlplus avec un client oracle

  11. #11
    Membre éprouvé Avatar de jmnicolas
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 427
    Points : 976
    Points
    976
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ;

  12. #12
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    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 :
    In a multitable insert, all of the insert_into_clauses cannot combine to specify more than 999 target columns.

  14. #14
    Membre habitué Avatar de PoichOU
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juillet 2006
    Messages : 328
    Points : 161
    Points
    161
    Par défaut
    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

  15. #15
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    ça me rappelle un peu :
    http://laurentschneider.com/wordpres...n-a-query.html
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Insertion multiple + sous-requête
    Par Cyprien_ dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/10/2007, 17h14
  2. Insertion de multiples sous formulaires
    Par EGSway dans le forum IHM
    Réponses: 1
    Dernier message: 10/10/2007, 20h17
  3. Réponses: 1
    Dernier message: 21/12/2006, 17h06
  4. [Oracle 10g]Insertion multiple, oracle 10g
    Par ViRouF dans le forum Oracle
    Réponses: 6
    Dernier message: 25/02/2006, 07h22
  5. Insertion multiple à base de sous requête SELECT
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/04/2005, 16h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo