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 04091 probleme de table mutante


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 43
    Points
    43
    Par défaut ora 04091 probleme de table mutante
    Bonjour,
    j'ai une erreur de ce type qui remonte et je ne saisis pas très bien le pourquoi, pour l'instant j'ai contourné le probleme mais j'aimerai comprendre et nettoyer ce que j'ai fait.

    dans un contexte hospitalier j'ai une table avec les séjours d'hospitalisation, et j'ai une table de facturation

    facturation: id_technique_sejour,numero_de_sejour,prestation, nombre
    séjour: id_technique_sejour, type_de_sejour

    le but ici étant de mettre a jour le type de séjour en fonction d'élément de facturation. J'ai donc créé une fonction get_type_sejour qui effectue quelque chose dans le genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function get_type_sejour(parametre_sejour numer) return varchar2
    select
        case 
             when prestation in (,,,,) then 'type1'
             when prestation in (,,,,) then 'type2'
        else 'ND'
        end into type_sejour
    from facturation a, sejours b
    and a.id_sejour = b.id_sejour
    and b.numero_sejour = parametre_sejour;
     
    return type_sejour;
    et après cela je comptais mettre a jour avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    update sejours ref
    set ref.type_sejour = get_type_sejour(ref.numero_sejour)
    et la boumbadaboum je me chope un sqlcode 4091 probleme de mutating table alors que je ne modifie en rien les données dans ma fonction, évidemment je réattaque ma table séjour car je passe alors par un index.

    comment contourner ce probleme?

    je suis en oracle 9.2.0.6

    Merci pour votre aide

  2. #2
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    Il y'a un article à ce sujet ici : http://sgbd.developpez.com/oracle/ora-04091/

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 43
    Points
    43
    Par défaut
    j'étais tombé sur l'article, mais je ne voyais aucune des solutions proposées répondre a mon utilisation.
    aucune envie de mettre un trigger sur cette table, au pire je passerai par une table temporaire.

  4. #4
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    Bonjour

    Il faut faire appel aux transactions autonomes

    dans ta fonction rajoutes ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    FUNCTION MyFonction(MyParam1:MyType,...) RETURN MyTypeReturn
    IS 
       PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
    ..
     
     
    END MyFonction;

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 207
    Points : 237
    Points
    237
    Par défaut
    Il faut éviter le pl-sql lorsque du sql suffit,
    tu peux tout simplement faire un update avec la partie sql qui est dans la fonction.
    en terme de perf ca sera plus rapide que d'utiliser une user fonction.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 43
    Points
    43
    Par défaut
    je l'utilise pour clarifier mon code, il s'agit d'un datawarehouse et j'ai pas mal d'indicateurs a calculer, de plus tout n'est pas faisable en sql pur, dans ce cas présent je dois faire des tests supplémentaires si il me ramène plusieurs records et dans certains cas attaquer d'autres tables.
    c'est toujours possible en sql avec pleins de condition, mais je préfere de loin gagner en lisibilité que sur les perfs, parceque la je serai parti pour une tartine alors que je trouve ca tout mimi dans un ps

    merci pour le PRAGMA AUTONOMOUS_TRANSACTION; ca marche

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/06/2011, 09h43
  2. problème de la table mutante (ora-04091)
    Par ando0098 dans le forum PL/SQL
    Réponses: 0
    Dernier message: 19/04/2010, 10h41
  3. erreur ora-04091:table mutante
    Par lido dans le forum PL/SQL
    Réponses: 7
    Dernier message: 09/02/2009, 12h26
  4. Probleme trigger-tables mutantes
    Par scariou29 dans le forum Administration
    Réponses: 2
    Dernier message: 17/11/2006, 17h13
  5. Réponses: 4
    Dernier message: 30/10/2005, 09h13

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