Problème d'insertion et d'update ORA-00001
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:
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.