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 :

Différer un trigger after insert


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 126
    Par défaut Différer un trigger after insert
    Bonjour à tous,

    J'ai un trigger AFTER INSERT qui doit donc se déclencher aprés insertion de données dans la table. Jusque là tout va bien.

    Le problème c'est que je fais un chargement par lot (via FME), et je souhaite que le trigger se déclenche une fois tous les enregistrements importés dans la table. Actuellement à chaque nouvel enregistrement le trigger s'active, ce qui fait ramer FME. Et surtout cela me produit autant de lignes que d'enregistrements insérés, alors qu'il ne me faudrait qu'une ligne pour le lot de données inséré.
    Auriez vous une solution à me proposer? Différer le trigger, insérer un paramètre dont j'ignore l'existence?

    Merci par avance,

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    C'est simple, il vous faut un trigger qui ne soit pas de type FOR EACH ROW.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 126
    Par défaut
    Merci Pomalaix, mon trigger n'est pas de type for each row.
    Voici le début:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE OR REPLACE TRIGGER schema.trig_test
    AFTER insert
    ON schema.test
    REFERENCING NEW AS NEW OLD AS OLD
    DECLARE
    et la suite et fin simplifiée de mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    nb INTEGER;
    SELECT COUNT(NUMERO) INTO nb FROM schema.test;
    INSERT INTO schema.historique_test (nb_histo) VALUES (nb);
    END trig_test;
    Mon fme insère un lot de 72140 enregistrements dans la table test, et je me retrouve avec 73 enregistrements dans la table historique_test. En regardant le contenu de la table historique_test, je m'aperçois qu'il m'a inséré une ligne tous les 1000 enregistrements. (le champ nb_histo est à 1000, 2000, 3000,etc...)
    D'autre part, avec ce trigger sur la table test mon fme met 14mn pour insérer les 72140 enregistrements, alors que sans il met 30s.
    Bref, j'ai donc bien encore un souci, et je suis preneuse de toutes suggestions...
    Merci d'avance,

  4. #4
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Si vous faites un seul INSERT, le déclencheur associé (qui n'est pas FOR EACH ROW) ne s'exécutera qu'une fois.
    J'ignore ce qu'est un FME, mais le problème vient de là : il fait plusieurs insertions.

    En passant, c'est incohérent de mettre REFERENCING NEW AS NEW OLD AS OLD
    dans un déclencheur qui n'est pas de niveau ligne, car vous ne pourrez jamais y utiliser le NEW ou le OLD. (Ce qui est étonnant, c'est qu'Oracle ne refuse pas cette clause à la création).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 126
    Par défaut
    FME est un ETL, il me permet d'insérer ou d'extraire des données de la base dans différents formats. Il gère également la donnée spatiale.
    C'est un outil trés puissant dont je ne pourrais plus me passer...

    En tous cas, cela signifie bien qu'il fait un INSERT toutes les 1000 lignes lues. Je vais voir s'il est possible de paramètrer ça, et je reviens vers vous pour vous dire ce qu'il en est. Merci

Discussions similaires

  1. Trigger after insertion pas validée
    Par guigeek dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 20/12/2006, 13h37
  2. Trigger after insertion pas validée
    Par guigeek dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/12/2006, 14h23
  3. Un Trigger After INSERT peut-il empêcher l'INSERT ?
    Par cian2006 dans le forum Oracle
    Réponses: 3
    Dernier message: 13/09/2006, 17h27
  4. Trigger after insert, sans each row, possible ??
    Par veenie dans le forum Oracle
    Réponses: 5
    Dernier message: 16/02/2006, 15h18

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