bonjour à tous,
je suis débutante avec Oracle et j'ai besoin de votre aide.
je dois réaliser le travail suivant:
Il y a une liste de fichiers dans la table d'audit dont le NO_EVENT= NULL.
1- je dois prendre le premier fichier de cette liste
2- sélectionner l'event_type de ce fichier
3- mettre a jour la table d'audit en mettant le NO_EVENT de ce fichier a EN COURS (3).
4- copier le fichier dans la table stg_in_call
5- mettre a jour la table d'audit en mettant le NO_EVENT de ce fichier a COPIé (4).
En cas de problème la procedure MAIN passe directement a l'exception et le NO_EVENT prend la valeur ERREUR D'EXECUTION (-9).
je dois refaire ce travail jusqu’à ce qu'il n'y ai plus aucun fichier dans la table d'audit NO_EVENT= NULL.
j'ai réussi à faire ça :
la fonction "GET_FIRST_FILE"qui permet de selectionner le 1er fichier:
la procédure "IMPORT_IN_CALL"qui permet de copier le fichier:
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 CREATE OR REPLACE FUNCTION GET_FIRST_FILE RETURN VARCHAR2 IS var_file VARCHAR2(100) := NULL; BEGIN SELECT file_name INTO var_file FROM (SELECT file_name FROM mzaudit.audit_processing_inunified_dwh a WHERE a.pmt_call_status = '4' AND mz_begin >= TRUNC( SYSDATE ) -450 AND UPPER( a.file_name ) LIKE 'RUN%' --AND SUBSTR( file_name, 21, 5 ) = event_type AND (stg_no_event IS NULL OR stg_no_event = -9) AND ROWNUM=1 ORDER BY SUBSTR( a.file_name, 5, 8 ) || SUBSTR( a.file_name, 14, 6 ) ); return var_file; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN OTHERS THEN pmt_log_error ('GET_FIRST_FILE', SQLCODE, SQLERRM, var_file, 2, NULL, NULL, 'Unknown error'); end; END; /
La procédure "MAIN"
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 CREATE OR REPLACE PROCEDURE import_in_call (I_fichier IN VARCHAR2, I_DATE1 IN VARCHAR2, I_DATE2 IN VARCHAR2) IS BEGIN INSERT INTO stg_in_call (MSISDN, MAIN_BALANCE, PROVIDER_ID, STARTOFCHARGINGDATE, TIMESTAMP, EVENT_TYPE, IS_ROAMING_CALL, CALLED_PARTY, CONVERSATION_DURATION, NORM_CONVERSATION_DURATION, NORM_DESTINATION, CHARGING_ACCOUNT, ACCOUNT1_NAME, ACCOUNT1_CHARGE, ACCOUNT1_NEWBALANCE, ACCOUNT2_NAME, ACCOUNT2_CHARGE, ACCOUNT2_NEWBALANCE, ACCOUNT3_NAME, ACCOUNT3_CHARGE, ACCOUNT3_NEWBALANCE, ACCOUNT4_NAME, ACCOUNT4_CHARGE, ACCOUNT4_NEWBALANCE, ACCOUNT5_NAME, ACCOUNT5_CHARGE, ACCOUNT5_NEWBALANCE, INSERT_DATE, FILE_NAME, OC_TYPE_COM, OC_COUT, OC_SOLDE, ROAMING_FLAG, OC_DESTINATION) SELECT MSISDN, MAIN_BALANCE, PROVIDER_ID, STARTOFCHARGINGDATE, TIMESTAMP, EVENT_TYPE, IS_ROAMING_CALL, CALLED_PARTY, CONVERSATION_DURATION, NORM_CONVERSATION_DURATION, NORM_DESTINATION, CHARGING_ACCOUNT, ACCOUNT1_NAME, ACCOUNT1_CHARGE, ACCOUNT1_NEWBALANCE, ACCOUNT2_NAME, ACCOUNT2_CHARGE, ACCOUNT2_NEWBALANCE, ACCOUNT3_NAME, ACCOUNT3_CHARGE, ACCOUNT3_NEWBALANCE, ACCOUNT4_NAME, ACCOUNT4_CHARGE, ACCOUNT4_NEWBALANCE, ACCOUNT5_NAME, ACCOUNT5_CHARGE, ACCOUNT5_NEWBALANCE, INSERT_DATE, FILE_NAME, OC_TYPE_COM, OC_COUT, OC_SOLDE, ROAMING_FLAG, OC_DESTINATION FROM pmt.m_in_call WHERE STARTOFCHARGINGDATE IN (I_date1, I_date2) AND file_name = I_fichier AND (ACCOUNT1_NAME IN ('ONNET_ACCOUNT:S_PERIODICBONUS', 'FORFAIT_ACCOUNT:S_PERIODICBONUS', 'ONPEAKACCOUNTID') OR ACCOUNT2_NAME IN ('ONNET_ACCOUNT:S_PERIODICBONUS', 'FORFAIT_ACCOUNT:S_PERIODICBONUS', 'ONPEAKACCOUNTID') OR ACCOUNT3_NAME IN ('ONNET_ACCOUNT:S_PERIODICBONUS', 'FORFAIT_ACCOUNT:S_PERIODICBONUS', 'ONPEAKACCOUNTID') OR ACCOUNT4_NAME IN ('ONNET_ACCOUNT:S_PERIODICBONUS', 'FORFAIT_ACCOUNT:S_PERIODICBONUS', 'ONPEAKACCOUNTID') OR ACCOUNT5_NAME IN ('ONNET_ACCOUNT:S_PERIODICBONUS', 'FORFAIT_ACCOUNT:S_PERIODICBONUS', 'ONPEAKACCOUNTID')); exception when no_data_found then null; when others then pmt_log_error ('IMPORT_IN_CALL', SQLCODE, SQLERRM, I_fichier, 2, NULL, NULL, 'Unknown error'); end; END; /
Quand j’exécute chaque procédure a part, elle me retourne le résultat attendu
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 CREATE OR REPLACE PROCEDURE STG_IN_MAIN IS var1 varchar2 (100) := NULL; var2 varchar2 (100) := NULL; nbr1 number := NULL; dat1 date := NULL; dat2 date := NULL; BEGIN FOR rec IN (SELECT * FROM MZAUDIT.AUDIT_PROCESSING_INUNIFIED_DWH) LOOP var1 := GET_FIRST_FILE; DBMS_OUTPUT.PUT_LINE ('Nom de fichier: '||var1); var2 := SUBSTR( var1, 21, 5); DBMS_OUTPUT.PUT_LINE ('Event_type: '||var2); UPDATE MZAUDIT.AUDIT_PROCESSING_INUNIFIED_DWH SET STG_START_CALL= SYSDATE, STG_NO_EVENT= 3 WHERE file_name = var1; nbr1 := GET_FILE_DATES (var1, dat1, dat2); IMPORT_IN_CALL (var1, dat1, dat2); UPDATE MZAUDIT.AUDIT_PROCESSING_INUNIFIED_DWH SET stg_end_call= sysdate, stg_no_event= 4 WHERE file_name = var1; END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; COMMIT; WHEN OTHERS THEN UPDATE MZAUDIT.AUDIT_PROCESSING_INUNIFIED_DWH SET stg_no_event= NULL, STG_START_CALL = NULL WHERE file_name = var1; pmt_log_error ('STG_IN_MAIN', SQLCODE, SQLERRM, var1, NULL, NULL, var2, 'Unknown error'); COMMIT; END; END; /
mais la procédure main affiche le nom du premier fichier de la liste et passe directement a l'exception.
Je n'ai pas réussi a identifié les erreurs.
Pouvez vous m'aider s'il vous plais...
Partager