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

SQL Oracle Discussion :

ORA-06519: Transaction autonome active detectée et annulée


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Par défaut ORA-06519: Transaction autonome active detectée et annulée
    Je suis sous Oracle 9.2.0.4 et j'ai une fonction :

    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
     
       FUNCTION FindDate(pDateEnt NUMBER, pPos NUMBER) RETURN NUMBER IS
     
    	  vDate			 NUMBER(12);
     
    	  MessErr			 VARCHAR2(512);
    	  MessCode           NUMBER;
     
    	PRAGMA AUTONOMOUS_TRANSACTION;
        BEGIN
     
    	  EXECUTE IMMEDIATE 'alter session set nls_language = ''FRENCH''';
     
    	  SELECT TO_CHAR(TO_DATE(DECODE(TO_CHAR(TO_DATE(pDateEnt,'YYYYMMDDHH24MI'),'D'),'1',pDateEnt,
    	  	     TO_CHAR(NEXT_DAY(to_date(pDateEnt,'YYYYMMDDHH24MI'),'LUNDI')-7,'YYYYMMDDHH24MI')),'YYYYMMDDHH24MI')+7*(pPos-1),'YYYYMMDD') || '0000'
    	  INTO vDate
    	  FROM DUAL;
     
    	  RETURN vDate;
     
    	  EXCEPTION
     
    	  	 WHEN OTHERS THEN
    	   ....
     
       END F_FindDate;
    Le but de cette fonction est de retourner le xéme LUNDI après la date en paramètre.

    Comme je veux être indépendant du paramétrage de la base, je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    alter session set nls_language = 'FRENCH'
    Comme je veux pas casser le paramétrage de la base je le fais en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AUTONOMOUS TRANSACTION
    Jusque la ça va...

    Le problème est que je prends aléatoirement une erreur ORA-06519. Et là je ne comprends plus rien...

    Parce que d'une part, même si je suis bien dans une AUTONOMOUS TRANSATION, je ne fais aucune mise a jour et d'autre part parce que dans plus de 99% des cas cela passe sans erreur et seulement de temps en temps j'ai cette erreur ORA-06509.

    Existe il une autre solution pour obtenir le même résultat (trouver LUNDI de manière indépendante de la base).

    Avez vous une idée d'où vient cette erreur "aléatoire"

    Merci

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par Wurlitzer Voir le message
    Comme je veux pas casser le paramétrage de la base je le fais en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AUTONOMOUS TRANSACTION
    Visiblement tu n'as pas compris le but de cette option

    http://searchoracle.techtarget.com/s...916824,00.html

  3. #3
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    en passant, le ALTER SESSION est inutile aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TO_CHAR(TO_DATE(pDateEnt,'YYYYMMDDHH24MI'),'D')
    devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TO_CHAR(TO_DATE(pDateEnt,'YYYYMMDDHH24MI'),'D', 'NLS_DATE_LANGUAGE=french')

  4. #4
    Membre chevronné Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Visiblement tu n'as pas compris le but de cette option
    Si, si, j'ai compris a quoi sert les AUTONOMOUS TRANSACTION. Cela crée une nouvelle session, la plus part du temps on s'en sert effectivement pour faire des mises a jours indépendantes de la session principale mais comme effet de bord on peut faire des ALTER SESSION qui n'ont plus que la porté la fonction sans polluer la session principale

    Citation Envoyé par orafrance Voir le message
    en passant, le ALTER SESSION est inutile aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TO_CHAR(TO_DATE(pDateEnt,'YYYYMMDDHH24MI'),'D')
    devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TO_CHAR(TO_DATE(pDateEnt,'YYYYMMDDHH24MI'),'D', 'NLS_DATE_LANGUAGE=french')
    Oui, ta solution me plait bien. C'est plus propre, j'avais testé quelque chose de similaire avec le NLS_LANGUAGE sans succes mais avec le NLS_DATE_LANGUAGE ca marche.

    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
    alter session set nls_language = 'FRENCH';
    Session altered.
    
    SELECT TO_CHAR(sysdate,'Day' ) FROM DUAL;
    Lundi   
    
    alter session set nls_language = 'AMERICAN';
    Session altered.
    
    SELECT TO_CHAR(sysdate,'Day' ) FROM DUAL;
    Monday   
    
    SELECT TO_CHAR(sysdate,'Day' , 'NLS_DATE_LANGUAGE=french') FROM DUAL;
    Lundi
    
    SELECT TO_CHAR(sysdate,'Day' , 'NLS_LANGUAGE=french') FROM DUAL;
    Monday
    Une petite bizarrerie qui ressemble bien à un bug... mais bon le principal est d'avoir une solution

    Sauf que en essayant ta solution, je viens de constater un bug dans ma fonction, le NLS qui à de l'infuence sur le numero du jours de la semaine ('D') est NLS_TERRITORY et non pas NLS_DATE_LAGUAGE ou NLS_LANGUAGE et la pas moyen de le passer en parametre du TO_CHAR. J'obtiens une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ORA-12702: invalid NLS parameter string used in SQL function
    si je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT TO_CHAR(sysdate,'D','NLS_TERRITORY=america' ) FROM DUAL;
    Du coup, il faut quand meme que je fasse un ALTER SESSION

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Citation Envoyé par Wurlitzer
    Si, si, j'ai compris a quoi sert les AUTONOMOUS TRANSACTION. Cela crée une nouvelle session, la plus part du temps on s'en sert effectivement pour faire des mises a jours indépendantes de la session principale mais comme effet de bord on peut faire des ALTER SESSION qui n'ont plus que la porté la fonction sans polluer la session principale

    Je ne pense pas que c'est correct: une transaction autonome démarre une transaction indépendante qui s'exécute dans la même session et en conséquence les effets d'un ALTER SESSION concernent bien la session et non la transaction.

    Exemple en 10.2.0.2:

    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
    dev001> set serveroutput on
    dev001> 
    dev001> select sys_context('USERENV', 'SID') from dual;
     
    SYS_CONTEXT('USERENV','SID')                                                    
    --------------------------------------------------------------------------------
    209                                                                             
     
    dev001> select sys_context('USERENV', 'LANGUAGE') from dual;
     
    SYS_CONTEXT('USERENV','LANGUAGE')                                               
    --------------------------------------------------------------------------------
    AMERICAN_AMERICA.UTF8                                                           
     
    dev001> 
    dev001> 
    dev001> declare
      2  sid number;
      3  lang varchar2(100);
      4  pragma autonomous_transaction;
      5  begin
      6  select sys_context('USERENV', 'SID') into  sid from dual;
      7  execute immediate 'alter session set nls_territory=''FRANCE''';
      8  dbms_output.put_line('autonomous sid:' || sid);
      9  select sys_context('USERENV', 'LANGUAGE') into  lang from dual;
     10  dbms_output.put_line('autonomous lang.:' || lang);
     11  rollback;
     12  end;
     13  /
    autonomous sid:209                                                              
    autonomous lang.:AMERICAN_FRANCE.UTF8                                           
     
    PL/SQL procedure successfully completed.
     
    dev001> show errors
    No errors.
    dev001> 
    dev001> select sys_context('USERENV', 'SID') from dual;
     
    SYS_CONTEXT('USERENV','SID')                                                    
    --------------------------------------------------------------------------------
    209                                                                             
     
    dev001> select sys_context('USERENV', 'LANGUAGE') from dual;
     
    SYS_CONTEXT('USERENV','LANGUAGE')                                               
    --------------------------------------------------------------------------------
    AMERICAN_FRANCE.UTF8

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    en effet, Wurlitzer fais une confusion entre session et transaction

    La transaction autonome permet par exemple de commiter une transaction particulière sans commiter toutes les transactions de la session.

  7. #7
    Membre chevronné Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Par défaut
    Citation Envoyé par pifor Voir le message
    Je ne pense pas que c'est correct: une transaction autonome démarre une transaction indépendante qui s'exécute dans la même session et en conséquence les effets d'un ALTER SESSION concernent bien la session et non la transaction.

    Exemple en 10.2.0.2:
    Mea Culpa

    Merci pour l'exemple qui à réussi a me faire comprendre mon erreur.

    Donc mon problème est entier. Comment faire si je veux faire un ALTER SESSION "temporaire" ?

    Il faut que je lise la valeur initiale, que je fasse mon ALTER, mon traitement puis que je refasse un ALTER avec la valeur initiale ?

    Y a rien de plus léger ?

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/03/2008, 16h38
  2. detecter l'annulation d'une fenetre prompt
    Par hisy dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 29/06/2006, 16h28
  3. ORA-01190 Problème après Activation BDD Standby
    Par Sergio_free dans le forum Oracle
    Réponses: 2
    Dernier message: 23/10/2005, 00h38
  4. Transaction autonomes pour une appli web en .NET
    Par lex0072 dans le forum Oracle
    Réponses: 11
    Dernier message: 08/07/2005, 15h36
  5. [Transaction autonome][PRIVILEGES]
    Par PpPool dans le forum Administration
    Réponses: 5
    Dernier message: 10/09/2003, 15h17

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