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 :
J'espère avoir été suffisamment clair et vous remercie d'avance pour votre aide.
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;
Partager