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 :

Incrémente avec un INSERT TO multi-ligne SANS SÉQUENCE [11g]


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Alternant concepteur développeur
    Inscrit en
    Février 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Alternant concepteur développeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2014
    Messages : 25
    Points : 15
    Points
    15
    Par défaut Incrémente avec un INSERT TO multi-ligne SANS SÉQUENCE
    Bonjour,

    Je m'excuse si une discussion existe déjà mais en cherchant depuis 2 jours je n'ai rien trouvé.
    Donc normalement j'avais créée une séquence et j'avais le choix avec nextval dans la requête ou un trigger à la création de la table, on m'a demandé de ne pas passer par cette solution, question de droit.
    Donc on m'a donné une fausse solution, récupérer la valeur max puis faire tout bêtement un + 1, ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO TABLE1 (COLONNE 1, COLONNE 2, COLONNE 3, COLONNE 4)
    SELECT (SELECT MAX(COLONNE1) + 1 FROM TABLE1), SYSDATE, P.COLONNE1, P.COLONNE2
    FROM TABLE2 P;
    Malheureusement le MAX() renvoi toujours la même valeur, j'imagine que le INSERT TO insère le total des lignes à la fin, du coup le SELECT MAX... se fait toujours sur la même ligne d’où la même valeur.
    Donc existe t'il une solution ou suis-je en train de perdre mon temps ?

    Merci pour tout éventuelle solution !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Citation Envoyé par Caidriq Voir le message
    Donc normalement j'avais créée une séquence et j'avais le choix avec nextval dans la requête ou un trigger à la création de la table, on m'a demandé de ne pas passer par cette solution, question de droit.
    Que veux-tu dire par "question de droit" ?
    Si tu ne peux pas créer de Séquence, tu peux peut-être créer une colonne de type IDENTITY...
    Le choix de la solution avec MAX(colonne) est le moins bon des trois que tu as présentés.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Alternant concepteur développeur
    Inscrit en
    Février 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Alternant concepteur développeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2014
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Apparemment il faut des droits particuliers pour pouvoir créer des séquences et des triggers et pour la création de la table ainsi que l'ajout de ligne, le user que j'utilise ne les a pas et ils ne veulent pas en changer.
    C'est la moins bonne des 3 et surtout ça ne marche pas, enfin en tout cas j'ai pas trouvé comment la faire marcher.
    IDENTITY c'est quoi exactement ?

    EDIT : Apparemment IDENTITY n'est accessible qu'à partir de oracle 12g.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 769
    Points : 52 722
    Points
    52 722
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH 
    T0 AS (SELECT MAX(COLONNE1) + 1 AS N 
           FROM TABLE1),
    T1 AS (SELECT ROW_NUMBER() OVER(ORDER BY SYSDATE) + N AS NEW_ID, SYSDATE, P.COLONNE1, P.COLONNE2
           FROM   TABLE2 P
                  CROSS JOIN T)
    INSERT INTO TABLE1 (COLONNE1, COLONNE2, COLONNE3, COLONNE4)
    SELECT * FROM T1;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre à l'essai
    Homme Profil pro
    Alternant concepteur développeur
    Inscrit en
    Février 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Alternant concepteur développeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2014
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH 
    T0 AS (SELECT MAX(COLONNE1) + 1 AS N 
           FROM TABLE1),
    T1 AS (SELECT ROW_NUMBER() OVER(ORDER BY SYSDATE) + N AS NEW_ID, SYSDATE, P.COLONNE1, P.COLONNE2
           FROM   TABLE2 P
                  CROSS JOIN T)
    INSERT INTO TABLE1 (COLONNE1, COLONNE2, COLONNE3, COLONNE4)
    SELECT * FROM T1;
    A +
    Lorsque je l'exécute dans TOAD j'ai une exception : ORA-00928: missing SELECT keyword et il me surligne le INSERT

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Il faut mettre la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO TABLE1 (COLONNE1, COLONNE2, COLONNE3, COLONNE4)
    En 1er avant le WITH.

    Vous êtes bien conscient que ce code ne pourra fonctionner que si vous êtes seul sur la base à faire des insertions.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Alternant concepteur développeur
    Inscrit en
    Février 2014
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Alternant concepteur développeur
    Secteur : Service public

    Informations forums :
    Inscription : Février 2014
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    Non je n'étais pas au courant, par curiosité, quelle en est la cause ? Je pense que finalement une séquence c'est vraiment le plus simple.

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Si un autre utilisateur/traitement ajoute une ou plusieurs lignes dans la table pendant que tu es en train d'effectuer ton import "de masse", es-tu certain que le MAX(identifiant) +n sera toujours unique ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 769
    Points : 52 722
    Points
    52 722
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Si un autre utilisateur/traitement ajoute une ou plusieurs lignes dans la table pendant que tu es en train d'effectuer ton import "de masse", es-tu certain que le MAX(identifiant) +n sera toujours unique ?
    Dans ce cas il suffit de monter le niveau d'isolation à SERIALIZABLE.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  10. #10
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Dans ce cas il suffit de monter le niveau d'isolation à SERIALIZABLE.

    A +
    Bonjour,
    Le niveau d'isolation ne courcerne que des transactions avec plusieurs requêtes. l'exécution d'une requête fonctionne toujours en serialisable.
    Ici ça ne changera rien de toute façon. Il faudrait locker la table pour utiliser ce mécanisme en multi utilisateur. La solution c'est la séquence. C'est fait pour.
    Cordialement,
    Franck
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

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

Discussions similaires

  1. [AC-2007] Insert Into multi-lignes
    Par Nerva dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 24/10/2016, 14h06
  2. insert multi lignes avec le même id
    Par wikiele dans le forum Développement
    Réponses: 7
    Dernier message: 21/08/2011, 09h56
  3. [WD-2003] Compte rendu avec multi lignes
    Par vbword dans le forum VBA Word
    Réponses: 7
    Dernier message: 25/05/2009, 15h39
  4. Réponses: 7
    Dernier message: 02/02/2009, 20h04
  5. INSERT multi-lignes avec valeurs connues
    Par herve91 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/11/2006, 23h13

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