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 :

Trigger et PIVOT


Sujet :

SQL Oracle

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 1
    Par défaut Trigger et PIVOT
    Bonjour,

    Donc je commence avec un petit déclencheur simple qui malheureusement ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE OR REPLACE TRIGGER modification_nb_exemplaire
    AFTER INSERT ON livre FOR EACH ROW
    BEGIN
      IF :new.nombre_exemplaire < 0 OR :new.nombre_exemplaire > 0  THEN
        UPDATE livre SET nombre_exemplaire = 0 
        WHERE no_livre = :new.no_livre;
      END IF;
    END;
    Le but de cette requête étant de corrigé l'insertion d'un champ de livre dont le nombre d'exemplaire est supérieur à 0.Auquel cas la donnée est forcé à 0 par le déclencheur,sinon tout est beau.

    Voici le code d'erreur : ORA-04091: la table LIVRE est en mutation ; le déclencheur ou la fonction ne peut la voir.J'imagine que c'est du au fait que la table est en cours de modification et n'a pas fini sa transaction mais j'ai hélas tout de même besoin de la modifier.

    Mon deuxième problème :

    J'ai la structure de table suivante appeler client :
    +-----------+----------------+
    | client    | numero_tel     |
    +-----------+----------------+
    | Gertrude  | (254) 358-5865 |
    | Gertrude  | (450) 388-5765 |
    | Getrude   | (514) 365-9999 |
    | Bob       | (111) 111-1111 |
    | Bob       | (222) 222-2222 |
    | Oncle sam | (333) 333-3333 |
    +-----------+----------------+
    Et je voudrais obtenir ceci comme présentation :
    +-----------+----------------+----------------+----------------+
    | client    | numero_tel1    | numero_tel2    | numero_tel3    |
    +-----------+----------------+----------------+----------------+
    | Gertrude  | (254) 358-5865 | (450) 388-5765 | (514) 365-9999 |
    | Bob       | (111) 111-1111 | (222) 222-2222 |                |
    | Oncle sam | (333) 333-3333 |                |                |
    +-----------+----------------+----------------+----------------+
    Comment opère t-on cette magie ? J'ai consulter plusieurs sites en lignes qui traitait comment transformer des ''row en column'' mais sans grand succès,tout ceci m'a sembler assez complexe.

    Bien évidemment,le nombre d'argument est fixe et connue à l'avance.Je vais laisser tomber le dynamique pour le moment.Dans ce cas précis c'est 3.

    Je précise que j'utilise oracle 10g comme SGBD.

    Voila,merci d'avance.

  2. #2
    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
    1) Utilisez un trigger de ligne before insert dans lequel si la condition du if est vrai alors affectez 0 au :new.nombre_exemplaire.
    2) Cherchez Pivot dans ce forum il y a pas mal d'exemples.

    [EDIT]
    Example of Data Pivots in SQL (rows to columns and columns to rows)
    [/EDIT]

  3. #3
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Pourquoi utiliser un trigger quand tu peux faire l'opération de mise à jour directement lors de la mise à jour de ta table ?

    Pour la fonction PIVOT, si tu es en 11G tu as la fonction LISTAGG qui peut t'aider sinon tu trouveras pas mal d'exemple sur ce site pour réaliser un PIVOT

    Exemples

  4. #4
    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 Scriuiw Voir le message
    ...Pour la fonction PIVOT, si tu es en 11G ...
    ...
    Je précise que j'utilise oracle 10g comme SGBD.
    ...

  5. #5
    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
    Citation Envoyé par mnitu Voir le message
    1) Utilisez un trigger de ligne before insert dans lequel si la condition du if est vrai alors affectez 0 au :new.nombre_exemplaire.
    Je pense que l'attribut DEFAULT 0 aurait sa place ici !

  6. #6
    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 Waldar Voir le message
    Je pense que l'attribut DEFAULT 0 aurait sa place ici !
    Permettez mois de ne pas être d’accord avec vous. Le DEFAULT existe pour utiliser une valeur par défaut quand la colonne en question n’est pas fournis dans les requêtes de mise à jour.
    Normalement on devrait utiliser une contrainte de vérification pour interdire les valeurs illicites. Personnellement, je n’aime pas de fournir une valeur en entrée d’un API et trouver dans la table une autre à la fin de la transaction.

  7. #7
    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
    Sur l'analyse purement technique, je suis d'accord.

    Mais je me suis penché sur le pourquoi, c'est ce qui m'a amené à envisager l'utilisation du default.

    Le déclencheur s'exécute sur l'insertion d'un nouveau livre et dit que si une valeur nombre_exemplaire est renseignée dans cette insertion, il faut la forcer à 0.

    Bien entendu cela implique qu'il ne faudrait pas proposer cette colonne en insertion pour déclencher le DEFAULT. Le déclencheur est plus sûr de ce côté-là.

Discussions similaires

  1. [power designer et Sybase] trigger
    Par mr_qno dans le forum Sybase
    Réponses: 4
    Dernier message: 12/07/2006, 18h32
  2. [Interbase6] Trigger : Post_event
    Par Andry dans le forum InterBase
    Réponses: 2
    Dernier message: 13/05/2003, 09h27
  3. Trigger ??
    Par XDeus dans le forum Développement
    Réponses: 6
    Dernier message: 31/03/2003, 09h44
  4. [PostgreSQL] Refus de STATEMENT dans un trigger
    Par alex2205 dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/03/2003, 12h51
  5. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

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