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 :

Insertion avec incrémentation


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 40
    Points : 29
    Points
    29
    Par défaut Insertion avec incrémentation
    Bonjour,
    j'ai 2 table, par exemple

    TABLE A contient

    iD LETTRE
    1 A
    2 B
    3 C

    TABLE B

    ID DEB FIN
    1 100A 200A
    2 100B 200B
    3 100C 200C
    4 101A 200A
    5 101B 200B
    6 101C 200C
    ainsi de suite
    Dans une formulaire il y a 2 champs NUM_DEB et NUM_FIN
    Dans NUM_DEB je saisi 100 et NUM_FIN je saisi 200

    quand je clique sur un bouton VALIDER, je souhaite avoir une insertion comme dans l'exemple de la TABLE B ci_dessus
    Mais je n'arrive pas concevoir la procédure adéquate
    Merci de vos réponse

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Quelles sont les règles pour alimenter les valeurs?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    Les données dans la table A sont invariable, et déjà stockées à l'avance

  4. #4
    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
    Bonjour,

    Le "ainsi de suite" est trop vague, peut-on avoir un 25, 101A, 200B par exemple ?
    C'est pourquoi Vanagreg demande la règle de gestion pour renseigner les 3 colonnes de la table B(ID, DEB, FIN)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Utiliser un query récursif avec CONNECT BY pour générer les numéro de 100 à 200
    et un CROSS APPLY sur la table A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT v || lettre AS deb, 200 || lettre as finFROM (
    	SELECT 100 + level - 1 AS v
    	FROM DUAL
    	CONNECT BY 100 + level - 1 <= 200
    ) num
    CROSS APPLY
    SELECT * FROM table_a
    Si vous voulez en faire une fonction, il faudra définir un TYPE OBJECT et TABLE OF de ce type que renverra la fonction qui prendra début et fin en paramètres.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Je vois plusieurs inconvénients

    • les valeurs A, B, C constituent à la fois un viol de la 1NF (donnée non atomique) et de la 2NF (pas de dépendance fonctionnelle de l'attribut par rapport à son identifiant
    • si on enrichit la première table de nouvelle(s) ligne(s), par exemple 4, D, il faudra mettre à jour en masse la deuxième table pour ajouter toutes les lignes correspondantes !


    Donc, ne stockez pas ces valeurs A, B, C dans la deuxième table, faites une concaténation lors de la restitution si besoin.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    Les valeurs dans la TABLE A ne changeront jamais, je suis d'accord pour la concaténation

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par McM Voir le message
    Bonjour,

    Le "ainsi de suite" est trop vague, peut-on avoir un 25, 101A, 200B par exemple ?
    C'est pourquoi Vanagreg demande la règle de gestion pour renseigner les 3 colonnes de la table B(ID, DEB, FIN)
    le ainsi de suite c'est jusqu'à 200C

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    et un CROSS APPLY sur la table A
    Je doute qu'en 10gR2 il y ait le CROSS APPLY. Mais sinon un CROSS JOIN fera l'affaire.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Je doute qu'en 10gR2 il y ait le CROSS APPLY. Mais sinon un CROSS JOIN fera l'affaire.
    On a sur la bonne voie voici l'exemple que je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT 
       DEB, 
       FIN,ID, LETTRE
    FROM A
    CROSS JOIN B
    ça donne

    DEB FIN ID LETTRE
    100 200 1 A
    100 200 2 B
    100 200 3 C

    là c'est OK mais j'aimerai que ça continue comme ça

    DEB FIN ID LETTRE
    100 200 1 A
    100 200 2 B
    100 200 3 C
    101 200 1 A
    101 200 2 B
    101 200 3 C

    jusqu'à comme ça

    DEB FIN ID LETTRE
    200 200 1 A
    200 200 2 B
    200 200 3 C

  11. #11
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WITH TA AS (SELECT 1 id, 'A' lettre FROM dual UNION ALL SELECT 2, 'B' FROM dual UNION ALL SELECT 3, 'C' FROM dual)
    SELECT ROWNUM num, w.deb || ta.lettre debut, :p_fin || ta.lettre fin
     FROM ta, (SELECT :p_deb + LEVEL -1 AS deb FROM DUAL connect BY LEVEL <= :p_fin - :p_deb + 1) w
    Avec p_deb = 15 et p_fin = 20, ça donne

    NUM DEBUT FIN
    1 15A 20A
    2 15B 20B
    3 15C 20C
    4 16A 20A
    5 16B 20B
    6 16C 20C
    7 17A 20A
    8 17B 20B
    9 17C 20C
    10 18A 20A
    11 18B 20B
    12 18C 20C
    13 19A 20A
    14 19B 20B
    15 19C 20C
    16 20A 20A
    17 20B 20B
    18 20C 20C
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    merci beaucoup

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    MCM, votre script marche très bien, mais dans une procédure j'ai une erreur : Symbole 'WITH' rencontré à la place d'un des symboles suivants:
    (select<une instruction SQL>
    voici la procédure

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    PROCEDURE LOAD IS
        CURSOR CUR_QTT IS
            WITH
                TA AS
                    (SELECT 1 ID, 'A' LETTRE FROM DUAL
                     UNION ALL
                     SELECT 2, 'B' FROM DUAL
                     UNION ALL
                     SELECT 3, 'C' FROM DUAL
                     UNION ALL
                     SELECT 4, 'D' FROM DUAL
                     UNION ALL
                     SELECT 5, 'E' FROM DUAL)
            SELECT ROWNUM NUM, W.DEB || TA.LETTRE DEBUT, :TXT_NUM_FIN || TA.LETTRE FIN
            FROM   TA,
                   (SELECT     :TXT_NUM_DEB + LEVEL - 1     AS DEB
                    FROM       DUAL
                    CONNECT BY LEVEL <= :TXT_NUM_FIN - :TXT_NUM_DEB + 1) W;
     
        I NUMBER := 0;
    BEGIN
        GO_BLOCK ('LISTE');
        FIRST_RECORD;
     
        FOR X IN CUR_QTT
        LOOP
            I := I + 1;
            :LISTE.L_NUM_DEB := X.DEBUT;
            :LISTE.L_NUM_FIN := X.FIN;
     
     
     
            NEXT_RECORD;
        END LOOP;
     
        FIRST_RECORD;
    END;

Discussions similaires

  1. Insertion multiple avec incrémentation
    Par Beaudelicius dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 17/05/2012, 15h58
  2. Interface : Insertion avec un champs auto incrémenté
    Par amnay dans le forum ODI (ex-Sunopsis)
    Réponses: 7
    Dernier message: 17/04/2012, 01h27
  3. requête d'insertion avec incrémentation
    Par sam01 dans le forum Requêtes
    Réponses: 2
    Dernier message: 08/10/2010, 14h27
  4. [AC-2003] Insertion avec valeur incrémentée
    Par walker34 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 28/09/2009, 16h54
  5. Update ou insert avec incrément d'un champ
    Par dany13 dans le forum ASP
    Réponses: 5
    Dernier message: 15/10/2004, 12h53

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