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

PL/SQL Oracle Discussion :

Update avant Insert


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Update avant Insert
    Bonjour, je suis en pleine prise en main du PL/SQL et j'aurais besoin de votre aide.

    Je veux insérer dans une table les données en provenance d'une autre (données sélectionnée et traitées).

    Voici une proposition qui ne marche pas. J'airerai savoir s'il était possible de procéder ainsi, si oui, où se trouve l'erreur?

    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
    38
    39
    CREATE OR REPLACE TRIGGER MAJ_VENTE_CLIENT
    BEFORE INSERT OR UPDATE ON VENTE_CLIENT
    FOR EACH ROW
    DECLARE
    code VARCHAR2(6);
    nom VARCHAR2(50);
    montant NUMBER;
    time VARCHAR2(4);
    time2 VARCHAR2(4);
    code2 VARCHAR2(6);
    CURSOR C1 IS
        SELECT ED.CODE_CLIENT, C.NOM_CLIENT, SUM(ED.MONTANT_DOC), to_char(ED.DATE_DOC,'yyyy') INTO code, nom,montant, time
        FROM ENTETE_DOCUMENTS ED, CLIENTS C
        WHERE ED.CODE_CLIENT = C.CODE_CLIENT
        GROUP BY ED.CODE_CLIENT, C.NOM_CLIENT, to_char(ED.DATE_DOC,'yyyy')
        ;
    CURSOR C2 IS
        SELECT CODE_CLIENT, ANNEE INTO code2, time2
        FROM VENTE_CLIENT
        ;
    BEGIN
    OPEN C1;
    OPEN C2;
    LOOP
    FETCH C2 INTO code2, time2;
    FETCH C1 INTO code, nom, montant, time;
    EXIT WHEN C2%NOTFOUND;
    EXIT WHEN C1%NOTFOUND;
    if (code = code2 and time = time2) THEN
        UPDATE VENTE_CLIENT
        SET MONTANT = montant
        ;
    ELSE
      INSERT INTO VENTE_CLIENT (CODE_CLIENT, NOM_CLIENT, MONTANT, ANNEE) VALUES(code, nom, montant, time);
    END if;
    END LOOP;
    CLOSE C2;
    CLOSE C1;
    END;

  2. #2
    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
    Regarde MERGE

  3. #3
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  4. #4
    Candidat au Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci pour vos retour.

    Voici une utilisation de MERGE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    MERGE INTO VENTE_CLIENT VC
        USING ENTETE_DOCUMENTS ED
        ON (ED.CODE_CLIENT = VC.CODE_CLIENT
            AND to_char(ED.DATE_DOC,'yyyy')= VC.ANNEE)
        WHEN MATCHED
        THEN UPDATE 
             SET VC.MONTANT = SUM(ED.MONTANT_DOC)
     
        WHEN NOT MATCHED
        INSERT (CODE_CLIENT, NOM_CLIENT, MONTANT, ANNEE) 
        VALUES(ED.CODE_CLIENT, null, SUM(ED.MONTANT_DOC), to_char(ED.DATE_DOC,'yyyy'))
    Après exécution j'ai ce message d'erreur

    ORA-00934: group function is not allowed here

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Merge Into Table
      Using (Select cle, Sum...
                  from autre table
                 Group By cle
              )
      On (cle = cle)
      ...

  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 utiliser une requête dans le USING :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    MERGE INTO VENTE_CLIENT VC
    USING (SELECT ED.CODE_CLIENT, C.NOM_CLIENT, SUM(ED.MONTANT_DOC) as sum_montant, to_char(ED.DATE_DOC,'yyyy') as annee
             FROM ENTETE_DOCUMENTS ED, CLIENTS C
            WHERE ED.CODE_CLIENT = C.CODE_CLIENT
            GROUP BY ED.CODE_CLIENT, C.NOM_CLIENT, to_char(ED.DATE_DOC,'yyyy')
          ) t
       ON (t.CODE_CLIENT = VC.CODE_CLIENT AND t.annee = VC.ANNEE)
     WHEN MATCHED THEN UPDATE
      SET VC.MONTANT = t.sum_montant
     WHEN NOT MATCHED then INSERT (CODE_CLIENT, NOM_CLIENT, MONTANT, ANNEE)
                           VALUES (t.CODE_CLIENT, t.nom_client, t.sum_montant, t.annee)

  7. #7
    Candidat au Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci pour vos réponses.

    Plus d'erreur mais test sur les données pas encore effectué

    merci encore

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/11/2009, 16h28
  2. test avant Insert (car clef primaire) sinon UPDATE
    Par The_macrafT dans le forum Développement
    Réponses: 6
    Dernier message: 22/10/2008, 21h08
  3. [MySQL] Vérification de la présence d'enregistrement avant insertion
    Par Odilon dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 28/09/2005, 15h30
  4. Réponses: 8
    Dernier message: 22/06/2005, 10h34
  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