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 :

Aide pour création d'un trigger


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Développeur Documentum Java
    Inscrit en
    décembre 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Documentum Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : décembre 2010
    Messages : 29
    Points : 33
    Points
    33
    Par défaut Aide pour création d'un trigger
    Bonjour a tous,
    Bon j'ai la table suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Clients(id,chef,etat1,etat2,etat3)
    Un batch remplit la table automatiquement, et pour la colonne chef, parfois elle ne contient que des espaces comme ' ', ce que je veux c'est remplacer ces espaces par un texte par défaut par exemple 'vide'
    Alors supposons que la ligne suivante est insérée
    j'aimerais avoir la ligne suivante dans ma table
    Je pense que les triggers Before Insert permettent de faire ça.
    A noter que les nombre d'espaces dans la colonne chef est généralement 3 espaces, mais je ne suis pas sûr s'elle peut contient plus ou mois d'espace ou même la valeur null
    Merci d'avance.

  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 575
    Points
    11 575
    Par défaut
    'vide' c'est n'importe quoi. Mettez Null et modifiez le batch pour qu'il gère ça correctement.

  3. #3
    Nouveau membre du Club
    Profil pro
    Développeur Documentum Java
    Inscrit en
    décembre 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Documentum Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : décembre 2010
    Messages : 29
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par mnitu Voir le message
    'vide' c'est n'importe quoi. Mettez Null et modifiez le batch pour qu'il gère ça correctement.
    Merci mnitu.
    Pour le batch, je ne peux pas le modifier. et pour la colonne chef, c'est une clé étrangère qui pointe vers une autre table chef.
    la table chef est comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Chef(ref, nom, prenom, ...)
    lorsque la colonne chef de Cllients contient vide, elle pointe vers une ligne dans la table chef. Ce qui n'est pas possible si elle est null.
    la table chef est alimentée par un autre batch, alors je ne peux pas mettre une ligne avec ref= ' '.
    Je ne sais pas si j'ai bien expliqué le problème, mais ce que je cherche c'est la façon de création d'un trigger qui permet de remplacer la valeur ' ' par une autre valeur 'xxx' chaque fois qu'une nouvelle ligne est insérée.
    J'ai déjà fait ça en MSSQL et je sais qu'il est possible de le faire en PL/SQl mais je n'arrive pas à le faire puisque je n'ai aucun expérience en PL/SQL.
    Merci.

  4. #4
    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 575
    Points
    11 575
    Par défaut
    La valeur 'vide' de la table Chef est elle aussi du n'importe quoi.
    Pour les triggers lisez "6. Les déclencheurs".

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    février 2010
    Messages
    4 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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 031
    Points : 7 225
    Points
    7 225
    Billets dans le blog
    1
    Par défaut
    Pour pallier à la valeur "vide" qui chagrine mnitu, ne pouvez-vous pas modifier le champ pour qu'il accepte les NULL ?

    Même s'il y a une FK, Oracle acceptera alors la valeur NULL.
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Nouveau membre du Club
    Profil pro
    Développeur Documentum Java
    Inscrit en
    décembre 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Documentum Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : décembre 2010
    Messages : 29
    Points : 33
    Points
    33
    Par défaut
    Bon j'explique un peu plus.
    Si la valeur de chef dans la table clients est égale à ' ', la jointure avec la table chef doit être avec une ligne.
    Si je mets des null à la place de ' ', je ne vais pas pouvoir faire une jointure entre les deux tables.
    Une autre raison:
    Si par exemple j'exécute la requête suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from clients, chef
    where client.chef=chef.ref
    je dois avoir pour les clients dont chef=' ' des informations par défaut.
    exemple: nom, prénom,....,nom chef par défaut, prénom chef par défaut,...
    pour cela il y a déjà une ligne dans la table chef avec comme ref vide.

  7. #7
    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 575
    Points
    11 575
    Par défaut
    Supprimez 'vide', faites une jointure externe.

  8. #8
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    mars 2010
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : mars 2010
    Messages : 506
    Points : 1 284
    Points
    1 284
    Par défaut
    Citation Envoyé par malimaot Voir le message
    lorsque la colonne chef de Cllients cintient vide, elle pointe vers une ligne dans la table chef. Ce qui n'est pas possible s'elle est null.
    Il y a quelque chose de très important à comprendre en Oracle lorsqu’il s’agit de contrainte (clé étrangère ou contrainte de vérification) et/ou de where clause (predicate en anglais).
    1. Un predicate passe la validation lorsqu’il s’évalue à VRAI
    2. Une contrainte passe la validation lorsqu’elle ne s’évalue pas à FAUX


    Et c’est là où réside la différence. Une contrainte qui ne s’évalue pas à FAUX peut avoir deux valeurs (a) VRAI ou (b) NULL. Ce qui veut dire qu’une clé étrangère peut être acceptée lorsqu’elle s’évalue à NULL. Voyant ceci en action:

    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
    24
    25
    26
    27
    28
    29
     
    mohamed@mhouri> create table t_parent(id number);
     
    Table créée.
     
     
    mohamed@mhouri> alter table t_parent add constraint t_uk unique(id);
     
    Table modifiée.
     
    mohamed@mhouri> create table t_child(id_c number);
     
    Table créée.
     
    mohamed@mhouri> alter table t_child add constraint c_fk foreign key (id_c) references t_parent(id);
     
    Table modifiée.
     
    mohamed@mhouri> insert into t_parent values(1);
     
    1 ligne créée.
     
    mohamed@mhouri> insert into t_parent values(2);
     
    1 ligne créée.
     
    mohamed@mhouri> insert into t_child values (1);
     
    1 ligne créée.
    Je vais maintenant insérer un enregistrement dans la table t_child qui n'existe pas dans la table t_parent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mohamed@mhouri> insert into t_child values (null);
     
    1 ligne créée.
    La clé étrangère dans ce cas a été validée car elle a été évaluée à NULL.

    Pire encore, j'ai déclaré intentionnellement, le champ id de la table t_parent comme unique et non comme clé primaire pour montrer que je peux faire ceci aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    mohamed@mhouri> insert into t_parent values(null);
     
    1 ligne créée.
     
    mohamed@mhouri> insert into t_child values(null);
     
    1 ligne créée.
    Ce petit rappel étant fait, vous pouvez naturellement laisser le champ chef de la table fille client à NULL, la clé étrangère qui lui est associée passera la validation comme expliqué plus haut. Et utiliser les jointures externes, comme vous l’a suggéré mnitu, afin de sélectionner les lignes du père (parent table) qui n’ont pas de correspondants dans la table fille (child table).
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

Discussions similaires

  1. Aide pour création d'un trigger Oracle
    Par malimaot dans le forum Oracle
    Réponses: 7
    Dernier message: 02/02/2012, 11h36
  2. Recherche aide pour création de site
    Par herve.delisle dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 11/06/2007, 15h03
  3. Réponses: 11
    Dernier message: 23/05/2007, 11h53
  4. Aide pour création requête
    Par in dans le forum Oracle
    Réponses: 7
    Dernier message: 19/06/2006, 14h55
  5. developpeur c++ demande aide pour création d'un pieton 3D
    Par fumidu dans le forum Développement 2D, 3D et Jeux
    Réponses: 6
    Dernier message: 29/05/2006, 18h51

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