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
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Madagascar

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

    Informations forums :
    Inscription : Septembre 2016
    Messages : 40
    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 Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    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 176
    Par défaut
    Bonjour,

    Quelles sont les règles pour alimenter les valeurs?

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

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

    Informations forums :
    Inscription : Septembre 2016
    Messages : 40
    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 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
    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)

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    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 624
    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 624
    Billets dans le blog
    10
    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
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Madagascar

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

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

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

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

    Informations forums :
    Inscription : Septembre 2016
    Messages : 40
    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
    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 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
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Madagascar

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

    Informations forums :
    Inscription : Septembre 2016
    Messages : 40
    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 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
    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

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

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

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

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

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

    Informations forums :
    Inscription : Septembre 2016
    Messages : 40
    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