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

Oracle Discussion :

Curseurs et tables en mutation


Sujet :

Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 16
    Par défaut Curseurs et tables en mutation
    Bonjour

    Dans le cadre d'une migration de SQL Server 7.0 vers Oracle 9i2, je suis confronté à un problème sur des triggers.
    Sous SQL Server, un trigger sur une table va utiliser un curseur sur cette même table, et va même jusqu'à y effacer des lignes. Sous Oracle, à partir du moment où on est dans le trigger, c'est qu'on a modifié les données de la table... donc la table est dite "en mutation" et toute opération de sélection ou de suppression est interdite...
    Comment puis-je faire pour contourner le problème?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 16
    Par défaut
    On la refait rapidement:
    Je me suis un peu emballé sur la suppression de ligne dans le trigger-même... ^_^;
    En revanche, il fait bien un select par le biais d'un curseur...
    Le problème reste donc entier

  3. #3
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Par défaut
    Citation Envoyé par ze_patoche
    En revanche, il fait bien un select par le biais d'un curseur...
    SELECT dans la table même ou dans une autre table (deleted, inserted ou updated) ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 16
    Par défaut
    Oui, select dans la table-même.

    CREATE TRIGGER my_trigger ON my_table
    FOR INSERT, UPDATE
    AS
    ...
    DECLARE my_cursor CURSOR SCROLL FOR
    SELECT champs1
    FROM my_table
    ...

    Quelque chose dans ce gout-là...
    En fait il y a bien une boucle principale sur un curseur sur la table inserted, mais il n'y a pas de problème de ce côté.

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Utilise la recherche de "mutating table" sur le forum.
    Ca a déja été posé comme question.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 16
    Par défaut
    Super, merci pour cette info.
    A présent je vois mieux le problème, mais je suis encore un peu coincé sur mon cas.
    L'idéal serait de faire de mon curseur une transaction autonome (puisqu'il ne fait qu'un select dans la table), mais il semblerait qu'on ne puisse faire ça qu'avec des "objets complets" type trigger, procédures, etc...

  7. #7
    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

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 16
    Par défaut
    Merci pour le lien, mais la recherche sur les tables mutantes m'avait mené aussi à cet article
    Je pensais m'en sortir avec des triggers qui faisaient appel à des procédures en transaction autonomes, mais je commence à en douter:
    Il y a 5 triggers qui s'enchainent les uns à la suite des autres.
    Je vais essayer de schematiser un peu la problématique:

    J'ai:
    - une table d'articles
    - une table de couts des articles
    - une table de nomenclatures qui regroupent des listes d'articles
    - une table d'historique des nomenclatures

    L'idée générale est la suivante:
    Dans le cas d'une modification d'un article, la table de cout d'article est modifiée (par trigger donc). Lors de la modification de la table des couts, la table des nomenclatures est mise à jour (toujours par trigger), avec une partie des informations contenues dans la table des articles (qui est donc toujours en mutation suite au 1er trigger).
    Et au cas où j'aurais réussi à contourner ce problème, il faut ensuite créer l'historique des nomenclatures en parcourant (ici par curseur) la table des nomenclatures (elle aussi toujours en mutation).

    En fait ça continue comme ça sur 2-3 générations par la suite... C'est un peu pour ça que je cherchais une solution générale plutôt que de changer chacun des traitements... ^_^;
    Ce qui m'étonne, c'est que tout ceci fonctionne sans problème sous SQL Server, et qu'Oracle ne semble pas pouvoir fonctionner de la même façon.
    J'ai essayé diverses options, les triggers en AFTER, externaliser les traitements qui pointent sur les tables mutantes dans des procédures en transactions autonomes (ce qui semble ralentir CONSIDERABLEMENT le traitement)...

    A présent, j'en suis à me demander si je jette le serveur Oracle par la fenêtre ou si je me recycle dans la boulangerie... ^^;

Discussions similaires

  1. Curseur VS Table de record
    Par ncode dans le forum PL/SQL
    Réponses: 1
    Dernier message: 21/07/2010, 17h52
  2. [Oracle8i][Trigger]Table en mutation
    Par Drizzt [Drone38] dans le forum Administration
    Réponses: 6
    Dernier message: 06/11/2009, 13h58
  3. ORA-22905: sur CURSEUR et TABLE (PIPELINED)
    Par miniworker dans le forum SQL
    Réponses: 7
    Dernier message: 10/12/2008, 14h30
  4. Erreur table en mutation
    Par bruce-willis dans le forum SQL
    Réponses: 1
    Dernier message: 25/03/2008, 09h50
  5. Réponses: 1
    Dernier message: 20/04/2006, 17h18

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