IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Problème de cohabitation commit/rollback


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 14
    Par défaut Problème de cohabitation commit/rollback
    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;
    /

  2. #2
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Tu es obligé de passer par une procédure autonome.

    Fais une recherche sur "pragma autonomous_transaction", tu trouveras des exemples d'utilisation.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 14
    Par défaut
    Salut !

    Apparement cela ne marche pas....
    Mes requetes ( execute immediate vreq de mon 'main') sont toujours bel et bien commitées... Pourtant le seul commit que je fais est dans ma procedure majgfitest

    * J'ai rajouté un rollback apres mon close c1;
    * J'ai remplacé les lignes d'insertion de mon programme (insert into gfitest) par des appels a ma procedure :

    majgfitest(vd3,vmsgerr,vd1,vd2,vnumero,ErrMajGfiTest);

    avec le code suivant :

    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
    CREATE OR REPLACE PROCEDURE majgfitest (vd3 varchar2,vmsgerr varchar2,vd1 timestamp, vd2 timestamp,vnumero number, ErrMaj out varchar2)  IS
     
    /************************************************************************/
    /* Procedure de mise a jour de la table  						*/
    /* vd3 : temps d'execution de la requete 								*/
    /* vmsgerr : code retour et message retour de l'execution de la requete */
    /* vd1 : date et heure de debut de l'execution de la requete 			*/
    /* vd2 : date et heure de fin de l'execution de la requete 				*/
    /* vnumero : numero de la requete en cours								*/
    /* ErrMajGfiTest : Gestion des erreurs maj gfitest en sortie			*/
    /************************************************************************/
     
    PRAGMA AUTONOMOUS_TRANSACTION ;
     
    BEGIN
    	update gfitest set temps=vd3,comm=vmsgerr,datedeb=vd1,datefin=vd2 where numero=Vnumero;
    	commit;
    	ErrMajGfiTest :='N';
     
    exception 
    when others then
     
    	DBMS_OUTPUT.PUT_LINE('SQLCODE = ' || SQLCODE || ' ' || 'SQLERRM:' || SQLERRM);
    	DBMS_OUTPUT.PUT_LINE('Erreur dans la procedure majgfitest!');
    	ErrMajGfiTest :='O';
    END;
    /

    Merci d'avance...

  4. #4
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Quelles sont les requêtes que tu exécutes ? Tu n'as pas de commit ? Ni d'instructions DDL ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 14
    Par défaut
    Les requetes sont stockees dans ma table LISTESREQUETES. Elles sont variees, des select , des insert etc...
    Justement, il n'y a pas de commit pour mes requetes car je ne veux pas les commiter! Je veux juste commiter les resultats (de temps d'execution) dans ma table prevue a cet effet (gfitest), et je ne veux commiter que celle la.
    Il n'y a aucune instruction DLL...
    J'espere avoir repondu a ta question.

    La ou je reste perplexe, c'est que d'apres ce que j'ai lu, l'instruction "pragma autonomous_transaction" rend justement autonome les commit faits dans ma procedure. Pourquoi cela impacte-t-il donc les requetes de mon "main" (d'ou j'appelle ma procedure) en les commitant egalement!?? J'ai verifié, il n'y a aucun commit dans mon "main"...

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par blobtwist Voir le message
    ...
    La ou je reste perplexe, c'est que d'apres ce que j'ai lu, l'instruction "pragma autonomous_transaction" rend justement autonome les commit faits dans ma procedure. Pourquoi cela impacte-t-il donc les requetes de mon "main" (d'ou j'appelle ma procedure) en les commitant egalement!?? J'ai verifié, il n'y a aucun commit dans mon "main"...
    Si il y a bien un, le voilà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BEGIN
    		execute immediate Vreq;
    	EXCEPTION
    		WHEN OTHERS then
    			vbexecuteimmediat := false;
    			vmsgerr := vSQLCODE; 
    			UPDATE LISTEREQUETES SET comm=vmsgerr  WHERE numero=Vnumero;
    			commit;	END;

Discussions similaires

  1. problème d'utilisation du commit/rollback
    Par xionz dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 12/06/2009, 14h54
  2. Transaction SQL / COMMIT / ROLLBACK
    Par stephane.julien dans le forum C#
    Réponses: 4
    Dernier message: 24/09/2007, 12h14
  3. [Oracle 9i] Delete, undo, commit, rollback Best practices
    Par fguigui dans le forum Administration
    Réponses: 2
    Dernier message: 30/04/2007, 14h00
  4. [Oracle 9i 10g] Problème de cohabitation serveur 9i 10g
    Par gwain dans le forum Administration
    Réponses: 5
    Dernier message: 26/04/2007, 19h16
  5. Commit/Rollback sous VBA
    Par mastasushi dans le forum Access
    Réponses: 4
    Dernier message: 05/05/2006, 10h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo