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 :

[Débutant][oracle 8i]Fonction équivalant a merge avec un trigger


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut [Débutant][oracle 8i]Fonction équivalant a merge avec un trigger
    Bonjours tous le monde, me revoila avec mes question de base de donnée, alors après avoir découvert que mon oracle ne supportait la fonction merge , j'ai décidé de me fair ma propres fonction.

    J'ai donc fait un trigger sur ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE or replace TRIGGER TRIGGER_TEST_ON_INSERT
    BEFORE INSERT ON ARCHIVES.dest_calendrier
    FOR EACH ROW
    begin
    IF EXISTS (Select * from archives.DEST_CALENDRIER D where :new.dest_ferme= D.dest_ferme)
    then
    Delete from archives.dest_calendrier where(:new.dest_ferme= D.dest_ferme);
    Insert into archives.dest_calendrier values(:new.dest_ferme, :new.dest_libelle);
    else
    Insert into archives.dest_calendrier values(:new.dest_ferme, :new.dest_libelle);
    end;
    Donc après compilation j'ai des messages d'erreurs : Sinon sa n'aurais pas été de moi...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    8/4      PLS-00103: Symbole ";" rencontré à la place d'un des symboles
             suivants :
             if
    J'ai déja essayer plusieur correction (enlever les ; les dpélacer, etc...) mais sa na pas marché.


    Je pense que les erreurs vienne de ma facon de fair les triggeur et de fair cohabiter if existe avec mais je ne voyais pas comment fair autrement. Merci de votre attention porté a mon sujet

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    IF EXISTS n'existe pas tout simplement

    Tu dois faire le SELECT et récupérer l'exception NO_DATA_FOUND

  3. #3
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Et pourquoi ne pas faire un update plutôt que DELETE + INSERT ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Ah bon? j'ai du voir sa ce matin sur le mauvais forum alors ( peut etre my sql ou autre...)

    Alors il faudrais que je fasse comme cela?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE or replace TRIGGER TRIGGER_TEST_ON_INSERT
    BEFORE INSERT ON ARCHIVES.dest_calendrier
    FOR EACH ROW
    begin
    Select * from archives.DEST_CALENDRIER D where :new.dest_ferme= D.dest_ferme;
    If No_data_found
    then
    Delete from archives.dest_calendrier where(:new.dest_ferme= D.dest_ferme);
    Insert into archives.dest_calendrier values(:new.dest_ferme, :new.dest_libelle);
    else
    Insert into archives.dest_calendrier values(:new.dest_ferme, :new.dest_libelle);
    end;
    En fait je vais aller voir le tutorials pour gérer les exeption et je repasseré apres


    Pour le delete + insert c'est provisoir je mettrai un UPDATE une fois que le scripte sera terminé mais pour l'instant j'ai plus facile a manipulé les delete et insert :d

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par wurzags
    En fait je vais aller voir le tutorials pour gérer les exeption et je repasseré apres
    Voila qui est sage... tu peux aussi tenté une recherche sur le forum

  6. #6
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Je ne ferais pas de select (perf...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    update ...
    if sql%notfound then
    insert ...
    end if;
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    en effet, c'est bien ça

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    merci a tous, j'ai fait comme plaineR ma conseiller et sa marche très bien. Merci et a bientot.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Bon alors j'ai fait mon trigger mais en fait ya un problème...

    Pour l'instalation du trigger pas de problèmes, mais quand j'insert quelque chose sur la table ou i y a le trigger et bien SQL plus plante.... ( comme si il faisait une loop sans fin ou qqch du genre la )


    voila la code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE OR REPLACE TRIGGER TRIGGER_TEST_ON_INSERT
    BEFORE INSERT ON ARCHIVES.dest_calendrier
    FOR EACH ROW
    begin
    Update archives.dest_calendrier set Dest_ferme = :new.dest_ferme,Dest_libelle=:new.dest_libelle;
    if sql%notfound then
    Insert into archives.dest_calendrier values(:new.dest_ferme, :new.dest_libelle);
    end if;
    end;

  10. #10
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Tu fais un trigger qui insère / met à jour sur la table de ton trigger, ce n'est pas possible de cette manière (en plus je ne vois pas l'intérêt...)
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Bah en fait sa me sert a faire un MERGE, mais sa bloc je ne sais pas pkoi... Il faudrais que je fasse une vue de cette table et que le trigeur soi sur cette veu et insert dans la table et a chaque insert suprimé la ligne inséré de la vue a la fin?

  12. #12
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Est-ce que tu souhaites faire ce que tu avais décrit dans cette discussion ?
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/06/2012, 16h49
  2. Fonction sql de time avec Oracle
    Par marvelromy dans le forum SQL
    Réponses: 5
    Dernier message: 08/10/2008, 15h25
  3. Réponses: 1
    Dernier message: 27/11/2007, 16h43
  4. [Oracle 10] Fonction ROWNUM avec condition
    Par SQL_Pour_les_Nuls dans le forum Langage SQL
    Réponses: 6
    Dernier message: 03/07/2006, 15h06
  5. équivalence de mysql_free_result() avec oracle
    Par vrossi59 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 22/02/2006, 17h49

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