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 de multiples lignes.


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 51
    Par défaut Insertion de multiples lignes.
    Bonjour a tous,

    j'ai voulus effectué une commande spécifié danc le tutoriel sql http://sqlpro.developpez.com/cours/sqlaz/dml/#L1.2 mes cela sans succés malgrès une base de donnée oracle.

    La commande en question est l'insertion explicite de multiple lignes de l'exemple 5:

    INSERT T_TITRE
    VALUES ('M.' , 'Monsieur',
    'Mlle.' , 'Mademoiselle'
    'Mme.' , 'Madame')


    J'obtiens une erreur " INTO manquant" !

    Pourquoi cette erreur et comment faire cette requette car j'ai beaucoup de lignes à insérer ?


    Merci par avance.

  2. #2
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    une petite révision des fondamentaux s'impose...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Insert INTO t_titre values ('M.' , 'Monsieur', 
    'Mlle.' , 'Mademoiselle' 
    'Mme.' , 'Madame')

  3. #3
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 51
    Par défaut
    Si j'execute j'ai l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-00913: trop de valeurs
    J'ai déjà essayé.

  4. #4
    Membre Expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Par défaut
    Attention : le doc. de SQLPro est relatif à la norme SQL.
    Hors il se trouve Oracle est bien basé sur la norme SQL mais ils n'hésitent pas à faire quelques écarts par rapport à cette norme.

    Il n'est donc pas si rare d'avoir des instructions SQL valides (au sens de la norme) mais qui sont rejetées par Oracle....

  5. #5
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Citation Envoyé par Yorglaa
    une petite révision des fondamentaux s'impose...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Insert INTO t_titre values ('M.' , 'Monsieur', 
    'Mlle.' , 'Mademoiselle' 
    'Mme.' , 'Madame')
    Ah oui ?
    J'en prendrai volontiers une louche aussi alors !

    Parce qu'à l'usage, cette syntaxe ne passe pas, et je ne trouve rien dans la doc (10g) qui laisse à penser qu'elle soit supportée.

  6. #6
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    en effet ! mea culpa !

    j'ai été un peu vite en besogne et me suis fourvoyé avec la syntaxe d'un insert "classique"...

    oups, navré !

    ceci dit, tiré du document en question :
    NOTA : le constructeur de lignes valuées est rarement implémenté dans les SGBDR. Oracle est l'un de seuls à accepter une telle syntaxe.
    je suis donc aussi curieux de savoir d'ou provient cette info et ces exemples (quelle version d'Oracle ?)

  7. #7
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Je dois être con mais dans ce code là je trouve qu'il manque surtout une virgule après Mademoiselle (en considérant que la syntaxe soit possible sous Oracle) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT T_TITRE
           VALUES  ('M.'    , 'Monsieur',
                    'Mlle.' , 'Mademoiselle'
                    'Mme.'  , 'Madame')

  8. #8
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Je crois pas que ce soit le problème. De toute façon mieux vaut mettre le nom des colonnes après la table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO T_TITRE (CODE, LIB)
           VALUES  ('M.'    , 'Monsieur');
    INSERT INTO T_TITRE (CODE, LIB)
           VALUES  ('Mlle.' , 'Mademoiselle');
    INSERT INTO T_TITRE (CODE, LIB)
           VALUES  ('Mme.'  , 'Madame');
    PS : Rappel pour les erreurs ORA :
    http://ora-xxxxx.ora-code.com/

  9. #9
    Membre émérite Avatar de plabrevo
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    On peut aussi le gerer en multiinsert:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    CREATE TABLE my_table
    (id1             INTEGER
    ,col1            VARCHAR2(4000))
    /
    INSERT ALL
      INTO my_table (id1, col1) VALUES (1,'Line1')
      INTO my_table (id1, col1) VALUES (2,'Line2')
      INTO my_table (id1, col1) VALUES (3,'Line3')
      INTO my_table (id1, col1) VALUES (4,'Line4')
      INTO my_table (id1, col1) VALUES (5,'Line5')
    SELECT 1 FROM dual
    /
    SELECT id1
    FROM   my_table
    /
    COMMIT
    /
     
    DROP TABLE my_table
    /

    Table created.


    5 rows created.


    ID1
    ------
    1
    2
    3
    4
    5

    5 rows selected.


    Commit complete.


    Table dropped.

  10. #10
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 35
    Par défaut
    Salut...

    Moi j'aurai écrit plutôt ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT T_TITRE INTO (Titre, Libelle)
           VALUES  ('M.'    , 'Monsieur', 
                    'Mlle.' , 'Mademoiselle' 
                    'Mme.'  , 'Madame')

  11. #11
    Membre Expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Par défaut
    Citation Envoyé par Titia765
    Salut...

    Moi j'aurai écrit plutôt ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT T_TITRE INTO (Titre, Libelle)
           VALUES  ('M.'    , 'Monsieur', 
                    'Mlle.' , 'Mademoiselle' 
                    'Mme.'  , 'Madame')
    Citation Envoyé par ludvax
    (...)
    La commande en question est l'insertion explicite de multiple lignes de l'exemple 5:

    INSERT T_TITRE
    VALUES ('M.' , 'Monsieur',
    'Mlle.' , 'Mademoiselle'
    'Mme.' , 'Madame')


    J'obtiens une erreur " INTO manquant" !
    (...)
    Vous voyez pas comme un problème ???

    Merci de lire l'intégralité des interventions avant de poster, notamment quand vous proposez exactement le code qui pose problème initialement.
    Sans oublier qu'il est bon d'intervenir, mais à bon escient... C'est à dire de ne poster que des réponses dont on est sûr ! ;-)

  12. #12
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Oups
    Corrigé mon code...

  13. #13
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 35
    Par défaut
    Citation Envoyé par LeoAnderson
    Citation Envoyé par Titia765
    Salut...

    Moi j'aurai écrit plutôt ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT T_TITRE INTO (Titre, Libelle)
           VALUES  ('M.'    , 'Monsieur', 
                    'Mlle.' , 'Mademoiselle' 
                    'Mme.'  , 'Madame')
    Citation Envoyé par ludvax
    (...)
    La commande en question est l'insertion explicite de multiple lignes de l'exemple 5:

    INSERT T_TITRE
    VALUES ('M.' , 'Monsieur',
    'Mlle.' , 'Mademoiselle'
    'Mme.' , 'Madame')


    J'obtiens une erreur " INTO manquant" !
    (...)
    Vous voyez pas comme un problème ???

    Merci de lire l'intégralité des interventions avant de poster, notamment quand vous proposez exactement le code qui pose problème initialement.
    Sans oublier qu'il est bon d'intervenir, mais à bon escient... C'est à dire de ne poster que des réponses dont on est sûr ! ;-)
    Il suffit de lire ATTENTIVEMENT pour se rendre compte que j'ai rajouté une clause INTO... Il ne s'agit donc pas du même code...

  14. #14
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par Titia765
    Citation Envoyé par LeoAnderson
    Citation Envoyé par Titia765
    Salut...

    Moi j'aurai écrit plutôt ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT T_TITRE INTO (Titre, Libelle)
           VALUES  ('M.'    , 'Monsieur', 
                    'Mlle.' , 'Mademoiselle' 
                    'Mme.'  , 'Madame')
    Citation Envoyé par ludvax
    (...)
    La commande en question est l'insertion explicite de multiple lignes de l'exemple 5:

    INSERT T_TITRE
    VALUES ('M.' , 'Monsieur',
    'Mlle.' , 'Mademoiselle'
    'Mme.' , 'Madame')


    J'obtiens une erreur " INTO manquant" !
    (...)
    Vous voyez pas comme un problème ???

    Merci de lire l'intégralité des interventions avant de poster, notamment quand vous proposez exactement le code qui pose problème initialement.
    Sans oublier qu'il est bon d'intervenir, mais à bon escient... C'est à dire de ne poster que des réponses dont on est sûr ! ;-)
    Il suffit de lire ATTENTIVEMENT pour se rendre compte que j'ai rajouté une clause INTO... Il ne s'agit donc pas du même code...
    1. Votre syntaxe est incorrecte : il faut faire insert into t_titre et non insert t_titre into

    2. Avez-vous testé votre solution ? Si oui sous quelle version ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SQL> create table t_titre (titre varchar2(30), libelle varchar2(30));
    Table créée.
     
    SQL> INSERT  INTO T_TITRE (Titre, Libelle)
      2         VALUES  ('M.'    , 'Monsieur', 
      3                  'Mlle.' , 'Mademoiselle' 
      4                  'Mme.'  , 'Madame');
                    'Mme.'  , 'Madame')
                    *
    ERREUR à la ligne 4 :
    ORA-00917: missing comma
     
    SQL> show release
    release 902000400

  15. #15
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Salut PlaineR,
    dans ton cas précis, il manque une virgule après 'Mademoiselle'

    mais ça ne résoud pas le "mystère" de cette syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL> INSERT  INTO T_TITRE (Titre, Libelle) 
      2             VALUES  ('M.'    , 'Monsieur', 
      3                      'Mlle.' , 'Mademoiselle',
      4                      'Mme.'  , 'Madame'); 
    INSERT  INTO T_TITRE (Titre, Libelle)
                 *
    ERREUR à la ligne 1 :
    ORA-00913: too many values
    SQL> show release
    release 902000600

  16. #16
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut
    Bonjour,

    De mon côté, j'effectue les insertions à partir de mon programme java..

    Je permets à l'utilisateur de choisir un fichier Excel et de là je crée une table qui enregistre le contenu.

    Je le fais de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    	sql="insert into USER.TABLE_NAME(CHAMPS1,CHAMPS2,CHAMPS3,CHAMPS4) values (?,?,?,?)";
    		statement = cn.prepareStatement(sql);
    		ArrayList cellsContent=(ArrayList)xls[0];
    		for(int j=0;j<cellsContent.size();j++)
    		{	/*if(j!=7 && j!=8 && j!=9 && j!=11)
    			sql+=(standard + "('" + String.valueOf(((ArrayList)(xls[0])).get(j)) + "' , '" + ((ArrayList)(xls[1])).get(j) + "' , '" + ((ArrayList)(xls[2])).get(j)+"' , '" + String.valueOf(((ArrayList)(xls[3])).get(j))+"')");*/
    			//sql+=standard + " ('"+((ArrayList)(xls[0])).get(j)+"','"+((ArrayList)(xls[2])).get(j)+"','"+((ArrayList)(xls[0])).get(j)+"','"+((ArrayList)(xls[0])).get(j)+"')";
    			statement.setString(1,String.valueOf(((ArrayList)(xls[0])).get(j))); //'"+((ArrayList)(xls[0])).get(j)+"','"+((ArrayList)(xls[2])).get(j)+"','"+((ArrayList)(xls[0])).get(j)+"','"+((ArrayList)(xls[0])).get(j)+"')
    			statement.setString(2,String.valueOf(((ArrayList)(xls[1])).get(j)));
    			statement.setString(3,String.valueOf(((ArrayList)(xls[2])).get(j)));
    			statement.setString(4,String.valueOf(((ArrayList)(xls[3])).get(j)));
    					// get the resultset
    			statement.executeQuery();
     
    		}
    Cependant, je préfèrerais passer par une procédure stockée, malheureusement, je ne sais pas comment passer des listes de java vers pl/sql..

    Y a-t-il un moyen plus performant ?

    J'ai tenté moi aussi le INSERT ALL mais j'ai rencontré certains problèmes (par exemple, max 1000 enregistrements peuvent être ajoutées) ou alors virgules manquantes alors que si je copie/colle sous SQL+ le même code, il n'y a aucun soucis..

    Enfin voilà, j'espère que vous pourrez m'en dire plus !

    Joyeux noël

  17. #17
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Citation Envoyé par libuma Voir le message
    J'ai tenté moi aussi le INSERT ALL mais j'ai rencontré certains problèmes (par exemple, max 1000 colonnes peuvent être ajoutées)
    Vous avez des tables avec plus de 1000 colonnes ?

  18. #18
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    457
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 457
    Par défaut
    typo

    1000 lignes, ça parait évident.

  19. #19
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par Yorglaa
    Salut PlaineR,
    dans ton cas précis, il manque une virgule après 'Mademoiselle'
    Exact, je n'ai pas copier la bonne commande
    Sinon j'ai la même erreur que toi, bien évidemment

  20. #20
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2007
    Messages : 59
    Par défaut Solution proposée par 'plabrevo'
    Bonjour plabrevo,

    1.)la solution que tu propose (ci-dessous) s'éxecute sans erreur. Bravo et merci !

    INSERT ALL
    INTO ... (,,) ... values (,,)
    INTO ... (,,) ... values (,,)
    INTO ... (,,) ... values (,,)
    INTO ... (,,) ... values (,,)
    select 1 from dual

    2.)Cependant, j'ai une question :

    que signifie la dernière instruction 'select 1 from dual' ?

    Quel sens a-t-elle à la fin d'une insertion multiple ?

    Merci pour ton éclairage.

    chat_roux

Discussions similaires

  1. Insert ou Update lignes multiples
    Par DeWaRs dans le forum Langage SQL
    Réponses: 8
    Dernier message: 18/05/2012, 17h49
  2. [MySQL] [Impossible] insertion de multiples ligne
    Par Akim13 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/04/2012, 23h14
  3. [MySQL] insertion de multiples lignes en utilisant checkbox
    Par amine-pv0 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 20/12/2010, 05h15
  4. insertion avec multiples lignes
    Par f066457 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/03/2006, 23h52

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