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 :

Pas de table "new" dans un trigger ?


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut Pas de table "new" dans un trigger ?
    Bonjour,

    Je suis plus habitué à l'écriture de triggers sous SQL Server que sous Oracle.

    Je souhaite faire un trigger "global" (donc pas "for each row").

    Lorsque les données inserrées correspondent à certains critères, je souhaite forcer la valeur inserrée.

    Voici ce que j'ai tenté d'écrire :
    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
    22
    23
     
    create or replace
    TRIGGER WTRIG_EVL 
    -------------------------------------------------------------------------------
    --      Trigger : wtrig_evl
    --      Fichier : ap$triggers:wtrig_evl.sql
    --      Si on est en train de créer un retour marchandise (V/RET) alors 
    --      l'emplacement de la livraison ne soit pas être repris. On est forcément
    --      sur un emplacement vide pour remettre en stock non réservé client.
    -------------------------------------------------------------------------------
    --      Auteur    : S.DEVIDAL
    --      Version |Date        |Auteur     |Objet
    -------------------------------------------------------------------------------
    --      V.1     | 2011-12-05 | S.DEVIDAL |Version initiale
    -------------------------------------------------------------------------------
    BEFORE INSERT ON EVL
    BEGIN
       update new
       set codemp = ' '
       where codsoc = 218
       and achvte = 'V'
       and typeve = 'RET';
    END;
    Voici les erreurs que je me prends dans la tête :

    Erreur(2,4): PL/SQL: SQL Statement ignored
    Erreur(2,11): PL/SQL: ORA-00942: table or view does not exist

    Pour le première erreur, j'ai aucune idée d'où ça vient.
    Et pour la seconde, j'en déduis que "new" n'existe pas... Et ":new" me fait une erreur du même acabit.

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    En mode FOR EACH ROW, voici ce que ça donne :

    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 WTRIG_EVL 
    -------------------------------------------------------------------------------
    --      Trigger : wtrig_evl
    --      Fichier : ap$triggers:wtrig_evl.sql
    --      Si on est en train de créer un retour marchandise (V/RET) alors 
    --      l'emplacement de la livraison ne soit pas être repris. On est forcément
    --      sur un emplacement vide pour remettre en stock non réservé client.
    -------------------------------------------------------------------------------
    --      Auteur    : S.DEVIDAL
    --      Version |Date        |Auteur     |Objet
    -------------------------------------------------------------------------------
    --      V.1     | 2011-12-05 | s.DEVIDAL |Version initiale
    -------------------------------------------------------------------------------
    BEFORE INSERT ON EVL FOR EACH ROW
    BEGIN
       if (:new.codsoc = 218 and :new.achvte = 'V' and :new.typeve = 'RET') then
          :new.codemp := ' ';
       end if;
    END;
    Mais pour des raisons de performances, je préférerais éviter de passer par un for each row.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Un trigger sans "FOR EACH ROW" est appelé une fois par requête.
    Le trigger avec est appelé une fois par ligne.

    Vu le besoin, seule la proposition FOR EACH ROW est valide !

    Et en effet, pas de table "new" ou "inserted", Oracle travaille avec les références de colonnes :new / :old.

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Ok.

    Ben pour une fois que je voulais faire un PL ensembliste...

    Pour le coup, c'est un peu pourri Oracle là... Donc on est obligé de se taper systématiquement un curseur quand on travaille avec un trigger Oracle et qu'on doit pouvoir manipuler les données modifiées ?

  5. #5
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Si vous pouvez identifer toutes vos lignes avec du SQL, pas la peine de faire du FOR EACH ROW, bien sûr, mais votre besoin semble fortement lié à chaque insertion.

    Cela dit, une façon de faire encore plus simple serait que dans ce cas particulier, les valeurs soient directement les bonnes, plutôt que de les modifier a posteriori avec un trigger.

  6. #6
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Si vous pouvez identifer toutes vos lignes avec du SQL, pas la peine de faire du FOR EACH ROW, bien sûr, mais votre besoin semble fortement lié à chaque insertion.
    Non, je ne peux pas identifier les lignes dans la table : c'est au moment de l'insertion que je veux forcer à vide.
    Ensuite, je dois permettre de mettre une valeur "à la main".
    Donc en aucun cas, je peux faire mon UPDATE directement sur la table EVL.
    En revanche, je voudrais pouvoir le faire sur les données inserrés.

    Citation Envoyé par Rei Ichido Voir le message
    Cela dit, une façon de faire encore plus simple serait que dans ce cas particulier, les valeurs soient directement les bonnes, plutôt que de les modifier a posteriori avec un trigger.
    Je vous laisse prendre votre stylo et du beau papier à lettre, et demandez à Generix de corriger leurs PPE STKEMP et AFFEMP sur une version qui n'est plus maintenue...

    AFFEMP :
    Ce paramètre permet de déterminer automatiquement les emplacements lors de la génération du bon de livraison ou de réception.
    STKEMP :
    Ce paramètre permet, en fonctionnement standard, d’affecter les emplacements pour les produits

    A1 = O
    Affectation automatique des emplacements lors de la génération de tous les bons.

    N4 = 0
    Ne fonctionne qu’avec la fonction GBLVG2 (depuis la version 5.0-00)

    Permet de personnaliser la gestion des lots lorsqu'un emplacement est réinitialisé.

    La valeur de l’emplacement est remise à " " mais on conserve la valeur du lot.

    Si toutes les lignes concernent le même lot alors on supprime toutes les lignes pour ne conserver que la ligne n°1 avec la quantité totale du poste.
    Bah j'ai positionné les deux paramètres sur mes deux fonctions de retour marchandises GBLVG2, et je suis bien en 5.2. J'ai bien un message d'alerte qui me dit que chaque produit n'a pas été affecté par un emplacement, mais quand je vais voir ce qu'il en est réellement... Bah cet apôtre me les a affecté quand même sur un emplacement

    Mais je te rassure, je ne m'amuse pas à écrire des triggers pour le plaisir... Moi aussi je préférerais que le progiciel fasse son boulot sans bugs...

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Et en effet, pas de table "new" ou "inserted", Oracle travaille avec les références de colonnes :new / :old.
    Je suppose qu'il faut lire "références de lignes :new et :old" ici ?

Discussions similaires

  1. ne peut pas simplement "aXSLProc.Process(aCursor);"
    Par didier.cabale dans le forum XMLRAD
    Réponses: 16
    Dernier message: 08/03/2006, 12h25

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