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

SQL Oracle Discussion :

Récuperation du max avec 2 select pour un insert


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 104
    Points
    104
    Par défaut Récuperation du max avec 2 select pour un insert
    Bonjour,

    Sous Oracle, je voudrais remplir une table en utilisant les données d'une autre et en incrémentant un identifiant en récupérant le max à chaque insert...Mon problème est que le max n'est calculé qu'une seule fois car il s'agit de 2 select imbriqués, par exemple :

    INSERT INTO toto (id, champ_toto)
    SELECT (SELECT MAX(id)+1 FROM toto), champ_tata FROM tata;

    Si mon max(id) est de 30 par exemple, tous les enregistrements qui seront créés auront l'id 31...

    Comment faire pour que le max s'incrémente a chaque fois svp ?

    Sachant que je ne veux/peux pas créer de séquence...

    Merci par avance

  2. #2
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Difficile....
    Tu vas avoir une erreur "Table mutating" (pas de select sur une table en modification dans une même session).
    Il me semble avoir lu dans le forum des choses avec une "AUTONOMOUS_TRANSACTION"
    Fais une recherche avec ce mot
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  3. #3
    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
    Avec Rownum ça peut marcher.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO toto (id, champ_toto) 
    SELECT (SELECT MAX(id) FROM toto) + rownum, champ_tata FROM tata;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    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
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par Garuda
    Il me semble avoir lu dans le forum des choses avec une "AUTONOMOUS_TRANSACTION"
    Fais une recherche avec ce mot
    Non cela ne marchra pas car il ne committe pas entre 2 select. Et attention à l'intégrité des données quand on utilise les transactions autonomes.

    Des idées de solution :
    - trigger + variable de package que tu incrémentes
    - utilisation de rownum
    - utilisation d'une table où tu stockes le dernier id créé

    Ta solution de calculer le max pour chaque insert est préjudiciable pour les perf si ta table toto est voluminueuse.
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  5. #5
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut pourquoi rownum ?
    quel rownum est ajouté ?
    Ne faut il pas plutôt utiliser row_number() ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <div style="text-align: left;">INSERT INTO toto (id, champ_toto) 
    SELECT (SELECT MAX(id) FROM toto) + row_number() , champ_tata FROM tata;</div>
    Par ailleurs je ne comprends pas ce que tu mets dans le champ tata ?
    une valeur d'un cahamp de tata alors où est le group by
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  6. #6
    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
    ROWNUM : numéro de la ligne ramenée par le SELECT.
    row_number() est une fonction analytique qui permet de faire des groupements.

    Comme dit Asktom : Fonctions Analytique, c'est bien mais faut les utiliser quand c'est nécessaire.

    Comme le dit PlaineR : le mieux est de calculer le max avant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT NVL(max(id),0) INTO v_max FROM TOTO;
    INSERT INTO toto (id, champ_toto) 
    SELECT v_max + rownum, champ_tata FROM tata;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

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

Discussions similaires

  1. Simplifier : plusieurs select pour un insert
    Par laurentSc dans le forum Langage SQL
    Réponses: 12
    Dernier message: 26/12/2013, 10h07
  2. Récuperer le max d'un select
    Par Yann_br dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/11/2010, 11h56
  3. récuperation de données avec un select
    Par guillaumeIOB dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/05/2010, 14h36
  4. Formulaire avec un select pour date
    Par okoweb dans le forum Langage
    Réponses: 4
    Dernier message: 23/08/2008, 20h09
  5. Réponses: 2
    Dernier message: 02/07/2008, 02h26

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