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 :

Syntaxe trigger Oracle


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Septembre 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 10
    Par défaut Syntaxe trigger Oracle
    Bonjour,

    Je cherche à faire un trigger Oracle qui puisse récupérer une valeur dans un table à partir de sa position géographique.
    J'ai deux tables :
    - Une première "FAIT" de type point avec les champs suivant (id_fait,id_quartier,x,y,geometrie)
    - Une deuxième "Quartier" de type surfacique avec les champs suivant (id_quartier,geometrie)

    Mon trigger (sur la table fait) procède en deux étapes:
    1. il calcule la géometrie de l'enregistrement à partir des X,Y (qui sont saisie automatiquement lors de l'implantation)
    2. Il récupère la valeur id_quartier de l'enregistrement de la table quartier dans lequel l'enregistrement fait est inclu.

    la syntaxe de mon trigger est la suivante :
    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
     
    create or replace trigger FAIT_GEOMETRY_TRG before insert or update
    on FAIT
    referencing new as new old as old
    for each row
    declare
    /***************************************
    alimentation du champ geometrie en automatique
    ***************************************/
    begin
        if :new.X is not null and :new.Y is not null
        then
        if inserting then :NEW.GEOMETRIE:=MDSYS.SDO_GEOMETRY(2001,141012,MDSYS.SDO_POINT_TYPE(:NEW.X, :NEW.Y, null), null, null); end if;
        if updating ('X') then :NEW.GEOMETRIE:=MDSYS.SDO_GEOMETRY(2001,141012,MDSYS.SDO_POINT_TYPE(:NEW.X, :NEW.Y, null), null, null); end if;
        end if;
        if :new.geometrie is not null
        then
        if inserting then select (select quartier.id_quartier from quartier,fait where sdo_relate(:new.geometrie,quartier.geometrie,'mask=inside') = 'TRUE' and id_fait=:new.id_fait)  into :new.id_quartier from fait; end if;
        if updating ('X') then select (select quartier.id_quartier from quartier,fait where sdo_relate(:new.geometrie,quartier.geometrie,'mask=inside') = 'TRUE'and id_fait=:new.id_fait) into :new.id_quartier from fait; end if;
        end if;
    end;
    Le trigger se compile bien mais lorsqu'il s'exécute oracle me dit que la table fait est en mutation.
    Je ne suis pas familier avec le language sql et je pense que mon problème vient de ma syntaxe lorsque j'utilise le select into.
    Comment puis-je contourner ce problème?

    Merci de votre aide.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Bonjour.
    Faire des SELECT sur une table en mutation n'est pas toujours autorisé.
    Que fait votre fonction SDO_GEOMETRY?

    Edit: vous pouvez jeter un oeil ICI.

    Edit2:
    L'instruction DML déclenchante est un INSERT INTO … VALUES(…) avec valeurs littérales "en dur (donc forcément une seule ligne insérée, contrairement à un INSERT/SELECT qui pourrait traiter plusieurs lignes d'un coup)
    Si vous insérez les lignes une par une, vous ne devriez pas avoir ce problème.

  3. #3
    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
    Dans un premier temps votre problème vient de la jointure utilisée dans le select. En fait, je pense, que vous n’avez pas besoin de faire la jointure et que votre select devrait utiliser que la table Quartier qui normalement n’est pas en mutation à ce moment.

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 10
    Par défaut
    Dans un premier temps votre problème vient de la jointure utilisée dans le select. En fait, je pense, que vous n’avez pas besoin de faire la jointure et que votre select devrait utiliser que la table Quartier qui normalement n’est pas en mutation à ce moment.
    Je suis obligé de faire un select (enfin il me semble) pour comparer mes deux géométrie dans le sdo_relate.

    Que fait votre fonction SDO_GEOMETRY?
    La fonction SDO_RELATE me permet de récupère l'enregistrement de la table quartier qui contient mon ponctuel fait.

    Si vous insérez les lignes une par une, vous ne devriez pas avoir ce problème.
    Les lignes peuvent être modifiées ou insérées uniquement une par une dans mon cas.

  5. #5
    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 mandarinet Voir le message
    ...Je suis obligé de faire un select (enfin il me semble) pour comparer mes deux géométrie dans le sdo_relate.

    ...
    Et pour quoi faire ce select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select quartier.id_quartier 
      into :new.id_quartier 
      from quartier 
     where sdo_relate(:new.geometrie,quartier.geometrie,'mask=inside') = 'TRUE'
    à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select (select quartier.id_quartier from quartier,fait where sdo_relate(:new.geometrie,quartier.geometrie,'mask=inside') = 'TRUE' and id_fait=:new.id_fait) into :new.id_quartier from fait;
    ne suffit pas ?

  6. #6
    Membre habitué
    Inscrit en
    Septembre 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 10
    Par défaut
    effectivement,merci, c'est beaucoup mieux!

    J'ai maintenant un autre souci lors de l'insertion :
    "J'ai l'erreur suivante ORA-13226: interface non prise en charge sans index spatial."
    Apparemment cette erreur provient normalement du fait qu'aucun index spatial n'est définit sur les tables concernées
    Pourtant un index spatial est pourtant bien crée sur mes tables quartier et fait.
    Cela provient-il du fait que ma géométrie ne soit techniquement pas encore validé mais de la forme :new.geometrie?

Discussions similaires

  1. [PL/SQL - Trigger Oracle] Données non retournées
    Par Hug0_76 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/02/2007, 23h12
  2. Pb de syntaxe trigger/begin.. end ?
    Par leup dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 19/01/2007, 14h04
  3. Probleme Trigger Oracle 9i
    Par Strit83 dans le forum PL/SQL
    Réponses: 5
    Dernier message: 27/11/2006, 14h24
  4. Erreur trigger oracle
    Par djsbens dans le forum Oracle
    Réponses: 7
    Dernier message: 22/02/2006, 13h37
  5. [JDBC]Probleme avec trigger Oracle
    Par aurel89 dans le forum JDBC
    Réponses: 2
    Dernier message: 02/08/2005, 11h53

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