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 :

Demande sur événement déclencheur


Sujet :

Oracle

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2011
    Messages : 790
    Points : 443
    Points
    443
    Par défaut Demande sur événement déclencheur
    Bonsoir ,

    Je suis entrain de travailler une application et dans ma base de donnée j'ai une table produit qui possède plusieurs champs dont lesquelles la date du produit.J'aimerais bien écrire au niveau de la base un code qui me permet par exemple lorsque la date d'un produit X déjà insérer dans la base de donnée dépasse 30 jours j'efface cette enregistrement.
    J'ai vraiment besoin de votre aide s'il vous plait si vous pouvez m'indiquer une méthode ou un petit tutorial sur comment je dois procéder car je me bloque maintenant.J'ai entendu parler qu'il faut faire un Job et autre truc ...
    J'ai besoin de votre aide
    Merci

  2. #2
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Ecrivez la requête qui supprime les produits. Ensuite intégrez cette requête dans une procédure. Ensuite programmez un job pour exécuter cette procédure.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2011
    Messages : 790
    Points : 443
    Points
    443
    Par défaut
    tout d'abord je vous remercie pour votre réponse
    Ensuite....Avant votre réponse j'ai cherché un petit peu sur le net et j'ai trouvé que je peux travailler avec les trigger et j'aimerais bien avoir votre avis est-ce-que je peux utiliser cette méthode autre que d'utiliser le job?Si oui voilà c'est ce sur j'ai fait mais je bloque un petit peu sur la condition if si vous pouvez voir ça avec moi s'il vous plait?
    Voilà dans ma table produit j'ai le champs date_mise_en_ligne, donc après chaque insertion et que la date est dépassé de 7 jours j'efface tous l'enregistrement
    Voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create or replace trigger TR_Produit
     as
    After Insert ON PRODUIT
    FOR EACH ROW
    BEGIN
    if(date_mise_en_ligne dépasse 7 jour)
    DELETE From PRODUIT where date_mise_en_ligne=?
    END;
    /
    Voilà comment j'ai raisonné mais j'ai pas trouvé comment je peux écrire lorsque la date est dépassé de 7 jours?
    J'aimerais bien avoir votre avis si ce code peux marcher ?et comment je peux écrire la condition "if" avec le langage base de donnée car j'ai pas trouvé vraiment?
    Merci pour votre aide encore une fois

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Ca ne fonctionnera pas avec un trigger for each row, en même tant l'utilisation d'un trigger for each row est ici inutile.
    Par contre si aucun produit n'est inséré pendant la journée alors les anciens produits ne seront pas supprimés, donc un trigger ne semble pas répondre au cahier des charges contrairement à un job qui s'exécuterait tous les soirs.

    La différence entre 2 dates est un nombre de jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM PRODUIT 
     WHERE date_mise_en_ligne < trunc(sysdate) - 7

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2011
    Messages : 790
    Points : 443
    Points
    443
    Par défaut
    Donc je suis sensé écrire un job au lieu d'un trigger?ou dans d'autre terme mettre la requête que vous m'avez donné dans un job qui s’exécute tous les soirs?

  6. #6
    Membre du Club
    Homme Profil pro
    ingénieur d'étude PL/SQL
    Inscrit en
    Octobre 2002
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur d'étude PL/SQL

    Informations forums :
    Inscription : Octobre 2002
    Messages : 53
    Points : 69
    Points
    69
    Par défaut
    en plus le trigger que tu as ecrit compile mais n'est pas correct.
    il va generer une erreur au 1e insert pour cause de table en mutation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ORA-04091: la table SAE.TRACE est en mutation ; le déclencheur ou la fonction ne peut la voir
    ORA-06512: à "SAE.TR_TRACE", ligne 3
    ORA-04088: erreur lors d'exécution du déclencheur 'SAE.TR_TRACE'

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2011
    Messages : 790
    Points : 443
    Points
    443
    Par défaut
    Merci pour votre réponse bon voilà j'ai essayé tout d'abord d'exécuter un petit job car je pense qu'il faut faire un job mais j'ai un petit problème c'est que lorsque j'exécute moi même le job il effectue le traitement mais lorsque je donne le startdate et interval ça marche pas de façon automatique

    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
    CREATE OR REPLACE
    PROCEDURE     P AS
    BEGIN
    insert into marque values ('1','qsfdg');
    standard.commit;
    END;
     
    et le job est :
     
     
    begin
      dbms_scheduler.create_job(
          job_name => 'JOB_SCHEDULE888'
         ,job_type => 'PLSQL_BLOCK'
         ,job_action => 'begin p(); end; '
         ,start_date => '21/02/2013 19:33:00'
         ,repeat_interval =>'freq=MINUTELY;interval=5',
         ,enabled => TRUE
         ,comments => 'Demo for job schedule.');
    end;
    Est-ce-que ça manque quelque chose que j'ai pas mentionné car ça marche pas de façon automatique il dépasse la date de deux minute sans rien faire ??
    Merci

  8. #8
    Membre du Club
    Homme Profil pro
    ingénieur d'étude PL/SQL
    Inscrit en
    Octobre 2002
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur d'étude PL/SQL

    Informations forums :
    Inscription : Octobre 2002
    Messages : 53
    Points : 69
    Points
    69
    Par défaut
    alors j'ai fait un test avec mon TOAD sur oracle 11GR2

    et le code suivant fonctionne

    1/1440 , c'est toutes les 60 secondes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    DECLARE
      X NUMBER ;
    BEGIN
      SYS.DBMS_JOB.SUBMIT
        (
          job        => X
         ,what       => 'p;'
         ,next_date  => to_date('02/22/2013 11:25:00','mm/dd/yyyy hh24:mi:ss')
         ,interval   => 'SYSDATE+1/1440 '
         ,no_parse   => FALSE
        );
    :JobNumber := to_char(X);
    END;

  9. #9
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    dbms_scheduler <> DBMS_JOB

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2011
    Messages : 790
    Points : 443
    Points
    443
    Par défaut
    Merci pour votre réponse ça marche maintenant..juste je veux savoir lorsque je crée cette procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM PRODUIT 
     WHERE date_mise_en_ligne < trunc(sysdate) - 7
    et qui va être mise dans un job. Est-ce-que cette procédure sera appliquée pour tous les enregistrements de ma table ?

    Merci !

  11. #11
    Membre du Club
    Homme Profil pro
    ingénieur d'étude PL/SQL
    Inscrit en
    Octobre 2002
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur d'étude PL/SQL

    Informations forums :
    Inscription : Octobre 2002
    Messages : 53
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par ahmedpa Voir le message
    Merci pour votre réponse ça marche maintenant..juste je veux savoir lorsque je crée cette procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM PRODUIT 
     WHERE date_mise_en_ligne < trunc(sysdate) - 7
    et qui va être mise dans un job. Est-ce-que cette procédure sera appliquée pour tous les enregistrements de ma table ?

    Merci !
    oui

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2011
    Messages : 790
    Points : 443
    Points
    443
    Par défaut
    Ok merci bien !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Demande de précision sur évènement click
    Par Skualys dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/07/2009, 23h33
  2. Problème sur évènement
    Par Azharis dans le forum Access
    Réponses: 2
    Dernier message: 12/01/2006, 16h36
  3. [O9i][Win][OMS]Erreur sur événement
    Par Fabien Celaia dans le forum Oracle
    Réponses: 4
    Dernier message: 05/11/2004, 15h00

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