Salut à tous,

Je me demande si ce que j'essaie de faire est tout simplement possible.

L'énoncé du probleme est le suivant:

Je boucle sur une table LISTEREQUETES contenant notament les colonnes:
REQUETE, TEMPS, MSG

A chaque enregistrement, je calcule le temps que mets la requete a s'executer, et j'ecris le temps dans LISTEREQUETES.TEMPS et le code retour oracle dans LISTEREQUETES.MSG .

Le probleme est que les requetes (LISTEREQUETE.REQUETE) ne doivent pas etre commitées!! Mais que j'ai tout de meme besoin de faire un commit pour ecrire le temps et le code retour de ces requetes dans ma table....

Voici le code epuré (c'est a dire sans mes tentatives de rollbacker les requetes). Pour le moment, mon code commit les requetes. Si quelqu'un voit comment faire pour rollbacker les requetes tout en commitant juste ma table LISTEREQUETES....

Merci d'avance!!

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
SET SERVEROUTPUT ON SIZE 100000;
Declare
 
 
/* Variables gestion de table LISTEREQUETES */
vnumero			number(12);		/* Numero de la requete*/	
Vreq			  varchar2(4000);	 /* Requete*/
 
/* Variables de traitement des erreurs */
VSQLCODE		number;			/* Code retour erreur oracle*/
vSQLERRM		varchar2(4000);	      /* Message retour erreur oracle*/
 
/* Variables traitement de calcul */
vMsgErr			varchar2(200);
 
vd1				timestamp;		/* Date de debut de ttt	*/
vd2				timestamp;  		/* Date de fin ttt          */
vd3				varchar2(6);		/* Temps d'execution du traitement au format 99,999 sec */
 
/* Variable flag -> true si l'execute immediate se passe bien false sinan */
vbexecuteimmediat	boolean;
 
/* Sélection des requetes SQL*/
cursor C1 is SELECT L.NUMERO,L.REQUETE
	     FROM LISTEREQUETES L ORDER BY L.NUMERO;
 
BEGIN
 
/* Début de la boucle du cursor 1 */
OPEN C1;
LOOP
	vbexecuteimmediat := true;
	vnumero	:= 0;		
	Vreq	:= null;
 
	fetch C1 into Vnumero,Vreq;
	exit when C1%NOTFOUND;
 
	/*Affichage du numero de la requete */	
        DBMS_OUTPUT.PUT_LINE('Requete numero:' ||Vnumero);
	/* Recuperation heure de debut                                                  */
	vd1 := systimestamp;
	/*Execution de la requete                                                       */
	BEGIN
		execute immediate Vreq;
	EXCEPTION
		WHEN OTHERS then
			vbexecuteimmediat := false;
			vmsgerr := vSQLCODE; 
			update LISTEREQUETES set comm=vmsgerr  where numero=Vnumero;
			commit;
	END;
 
	/* Recuperation heure de fin                                                    */
	vd2 := systimestamp;
	/* Calcul du temps de la requete                                                */
	vd3 := substr(to_char(vd2-vd1),18,6);
	vmsgerr := SQLCODE; 
	/* Ecriture du temps et du msg d'erreur dans la table                     */
	if vbexecuteimmediat = true then
		update gfitest set temps= vd3,comm=vmsgerr,datedeb=vd1,datefin=vd2 where numero=Vnumero;
		commit;
	end if;
 
END LOOP;
CLOSE C1;
exception 
when others then
	vmsgerr :=  SQLCODE; 
	DBMS_OUTPUT.PUT_LINE(vmsgerr);
	DBMS_OUTPUT.PUT_LINE('Arret du programme - Erreur fatale!');
 
end;
/