Bonjour à tous,
J'ai actuellement un stored proc qui fonctionne (chargement de donnée dans une table)
Mon souci c'est que à la premiére erreure du merge, Oracle sort de la procédure. Moi j'aimerai parcourir tous le senregistrements et poursuivre malgré une erreure. Pensez vous que c'est possible avec MERGE ?
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 create or replace procedure imp_cap_brand as begin declare error_var integer; my_select VARCHAR2(4000); begin DBMS_ERRLOG.CREATE_ERROR_LOG('BRD', 'ERRLOG'); --création de la table de log d'erreur MERGE INTO BRD --debut du merge USING WK_CAP_MANUFACTURERS WK_BRD ON (WK_BRD.MANUFACTURER_CODE=BRD.BRD_ID) WHEN MATCHED THEN UPDATE SET BRD.BRD_NM = WK_BRD.MANUFACTURER_NAME, BRD.BRD_ABBR = WK_BRD.MANUFACTURER_CAP_CODE_LOOKUP, BRD.BRD_TYP_CD = '001' WHEN NOT MATCHED THEN INSERT (BRD.BRD_ID,BRD.BRD_NM,BRD.BRD_ABBR,BRD.BRD_TYP_CD) VALUES (WK_BRD.MANUFACTURER_CODE ,WK_BRD.MANUFACTURER_NAME ,WK_BRD.MANUFACTURER_CAP_CODE_LOOKUP, '001') LOG ERRORS INTO errlog ('BRD_MERGE_INSERT'); -- on teste si on a rencontré une erreure durant le merge my_select := 'SELECT count(ORA_ERR_NUMBER$) FROM errlog'; execute immediate(my_select) into error_var; DBMS_OUTPUT.PUT_LINE(error_var); If error_var = 0 Then DBMS_OUTPUT.PUT_LINE('Aucune erreure'); else DBMS_OUTPUT.PUT_LINE('Erreure trouvée'); End if; my_select := 'DROP TABLE ERRLOG'; execute immediate(my_select); --gestion des erreures c'est là que j aimerai retourné dans le merge exception when others then DBMS_OUTPUT.PUT_LINE('Erreure remontée'); --rollback; -- rollback la transaction --raise; end; end imp_cap_brand;
Partager