Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/09/2011, 13h13   #1
Invité de passage
 
Otmane MALIH
Inscription : décembre 2010
Messages : 22
Détails du profil
Informations personnelles :
Nom : Otmane MALIH

Informations forums :
Inscription : décembre 2010
Messages : 22
Points : 1
Points : 1
Par défaut Aide pour création d'un trigger

Bonjour a tous,
Bon j'ai la table suivante
Code :
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.
malimaot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 15h18   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 813
Points : 5 813
'vide' c'est n'importe quoi. Mettez Null et modifiez le batch pour qu'il gère ça correctement.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/09/2011, 15h51   #3
Invité de passage
 
Otmane MALIH
Inscription : décembre 2010
Messages : 22
Détails du profil
Informations personnelles :
Nom : Otmane MALIH

Informations forums :
Inscription : décembre 2010
Messages : 22
Points : 1
Points : 1
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 :
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.
malimaot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 16h49   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 813
Points : 5 813
La valeur 'vide' de la table Chef est elle aussi du n'importe quoi.
Pour les triggers lisez "6. Les déclencheurs".
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 17h33   #5
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
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.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2011, 18h14   #6
Invité de passage
 
Otmane MALIH
Inscription : décembre 2010
Messages : 22
Détails du profil
Informations personnelles :
Nom : Otmane MALIH

Informations forums :
Inscription : décembre 2010
Messages : 22
Points : 1
Points : 1
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 :
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.
malimaot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2011, 12h32   #7
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 813
Points : 5 813
Supprimez 'vide', faites une jointure externe.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 08h43   #8
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
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 :
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 :
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 :
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 Cordialement
www.hourim.wordpress.com
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h19.


 
 
 
 
Partenaires

Hébergement Web