Bonjour à toutes et à tous,
Je suis étudiant en deuxième année de dut informatique, et suis actuellement en période de stage.
Je sais pertinemment que l'erreur ORA-00001 revient souvent sur les forums cependant n'ayant trouvé aucune réponse à mes questions je me tourne vers vous.

Actuellement, je développe une routine devant mettre à jour des données lorsqu'un fournisseur existe pour une référence, ou alors si il n'existe pas, insérer ce nouveau fournisseur avec différentes données complémentaires.
A partir d'un fichier Excel je récupère des données que je place dans une tables temporaires "imp_gco_purchase2_".
J'utilise un curseur pour parcourir cette table ligne par ligne.

Lorsque mon fichier excel ne comporte que des insertions cela fonctionne, de même lorsqu'il ne comporte que des éléments à mettre à jours.
En revanche, lorsqu'il y a des mises à jours et des insertions j'obtiens l'erreur :
"Error at line 1
ORA-00001: violation de contrainte unique (C_TEST.GCO_COMPL_DATA_PURCHASE_PK2)
ORA-06512: à "C_TEST.IMP_GCO_PURCHASE2", ligne 333
ORA-06512: à ligne 39"


"Imp_gco_purchase2" correspond a un package comprenant diverses procédures et la ligne 333 correspond à ma procédure d'insertion. J'en conclus que lorsqu'il y a des insert et des update dans mon fichier ma routine n'établit pas de séparation et tente d'insérer les éléments qui ne devraient qu'être mis à jours et de ce fait m'indique une duplication de clé unique.

Voici mon code :
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
40
41
42
43
44
45
46
47
48
49
50
51
52
DECLARE
 
   PPID VARCHAR(50);
   TMP VARCHAR(50);
   TMP2 INTEGER;
   CURSOR PARCOURLIGNE IS 
   (SELECT * FROM IMP_GCO_PURCHASE2_);
 
 
 
BEGIN
 
 
   FOR N IN PARCOURLIGNE
   LOOP
 
       C_TEST.IMP_GCO_PURCHASE2.IMP_GCO_PURCHASE2_CTRL;   
 
       BEGIN 
 
           PPID := null;
           TMP := null;
           TMP2 := 0;
 
           SELECT PAC_PERSON_ID into PPID FROM PAC_PERSON where PAC_PERSON.PER_KEY1 = any N.PER_KEY1;
 
           SELECT count(IMP_GCO_PURCHASE2_.PER_KEY1) INTO TMP2 FROM GCO_COMPL_DATA_PURCHASE, IMP_GCO_PURCHASE2_, PAC_PERSON
           WHERE PAC_PERSON.PER_KEY1 = N.PER_KEY1
           AND GCO_COMPL_DATA_PURCHASE.GCO_GOOD_ID IN (SELECT GCO_GOOD_ID FROM GCO_GOOD, IMP_GCO_PURCHASE2_ WHERE GCO_GOOD.GOO_MAJOR_REFERENCE = N.GOO_MAJOR_REFERENCE)
           AND IMP_GCO_PURCHASE2_.GOO_MAJOR_REFERENCE = N.GOO_MAJOR_REFERENCE
           --AND PPID = any GCO_COMPL_DATA_PURCHASE.PAC_SUPPLIER_PARTNER_ID
           AND IMP_GCO_PURCHASE2_.ID = N.ID
           and imp_gco_purchase2_.goo_major_reference in ( select gco_good.goo_major_reference from gco_good where gco_good.gco_good_id = GCO_COMPL_DATA_PURCHASE.gco_good_id)           
           AND PAC_PERSON.PAC_PERSON_ID 
           IN(SELECT PAC_PERSON_ID FROM PAC_PERSON, IMP_GCO_PURCHASE2_ WHERE IMP_GCO_PURCHASE2_.PER_KEY1 = PAC_PERSON.PER_KEY1)
           AND PAC_PERSON.PAC_PERSON_ID = ANY GCO_COMPL_DATA_PURCHASE.PAC_SUPPLIER_PARTNER_ID;
 
 
            IF TMP2 = 0 THEN C_TEST.IMP_GCO_PURCHASE2.IMP_GCO_PURCHASE2_IMPORT;
 
            ELSE 
            C_TEST.IMP_GCO_PURCHASE2.IMP_GCO_PURCHASE2_UPDATE; 
 
            END IF;  
 
            EXCEPTION WHEN NO_DATA_FOUND THEN NULL;
            --EXCEPTION WHEN DUP_VAL_ON_INDEX THEN C_TEST.IMP_GCO_PURCHASE2.IMP_GCO_PURCHASE2_UPDATE;
 
       END;
 
   END LOOP; 
END;
J'espère avoir été suffisamment clair et vous remercie d'avance pour votre aide.