Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
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 12/03/2007, 10h29   #1
Membre à l'essai
 
Inscription : mai 2005
Messages : 55
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2005
Messages : 55
Points : 22
Points : 22
Par défaut Problème de comparaison de numbers avec =, mais OK avec LIKE

Version: Oracle Database 10g Enterprise Edition Release 10.2.0.2.0

Bonjour,

J'ai un drole de résultat à l'execution de la requète suivante:
Il ne me retourne pas de tuple, mais lorsque je mets un LIKE à la place du signe = au niveau de la comparaison des postes , cela fonctionne.

Cela fonctionne avec le signe = dans les conditions suivantes :
Si on met en commentaire une des 2 requetes de l'union ou si on fait assign.m_post_id = po.post_id(+)
Le type de post_id est identique dans toutes les table, c'est du number(6).

Comment cela se fait-il?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT po.* 
    FROM P_BREAK_PERIODS bp
   , P_PERSONS pe
   , (SELECT a.start_date
	       , a.end_date 
	       , a.m_post_id 
		   , a.person_id 
	  FROM P_ASSIGNMENTS a
	  WHERE a.sequence <> 99999
	  UNION
	  SELECT c.start_date  
		   , c.end_date
		   , c.m_post_id 
		   , c.person_id
      FROM P_CONTRACTS c) assign
   , M_POSTES po
   , P_ABSENCE_TYPES a
 WHERE pe.person_id = bp.person_id
   AND pe.person_id = assign.person_id
   AND assign.m_post_id = po.post_id
   AND TRUNC(NVL(bp.end_date,SYSDATE)) >= TRUNC(assign.start_date)
   AND TRUNC(bp.start_date) <= TRUNC(NVL(assign.end_date,SYSDATE))
   AND bp.absence_tp_id = a.absence_tp_id(+)
squallJ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 10h52   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
ça peut être NULL ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 11h17   #3
Membre à l'essai
 
Inscription : mai 2005
Messages : 55
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2005
Messages : 55
Points : 22
Points : 22
Oui , il se peut que le post_id soit null.
Mais normalement , même si il y a des NULL, il doit tout de même retourné ceux dont la comparaison était OK non?
squallJ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 11h48   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Tu peux essayer de réduire ta requete (en nombre de tables annexes) pour ne garder que "assign" et "po" ?

Ensuite faudrait trouver un cas qui est ramené par le like et pas par le =
et afficher toutes les colonnes qui sont dans ta requete dans le SELECT
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 12h07   #5
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par squallJ
Oui , il se peut que le post_id soit null.
Mais normalement , même si il y a des NULL, il doit tout de même retourné ceux dont la comparaison était OK non?
Dans ce cas une égalité avec NULL est forcément fausse

Remplace :
Code :
AND assign.m_post_id = po.post_id
par :
Code :
AND NVL(assign.m_post_id,'NULL') = NVL(po.post_id,'NULL')
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 12h16   #6
Expert Confirmé
 
Homme
Chef de projet en SSII
Inscription : janvier 2004
Messages : 2 866
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 866
Points : 3 448
Points : 3 448
Citation:
Envoyé par Fred_D
Code :
AND NVL(assign.m_post_id,'NULL') = NVL(po.post_id,'NULL')
Non tu vas obtenir une erreur ORA-01722 - Invalid number
__________________
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.
plaineR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 13h59   #7
Membre à l'essai
 
Inscription : mai 2005
Messages : 55
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2005
Messages : 55
Points : 22
Points : 22
Citation:
Tu peux essayer de réduire ta requete (en nombre de tables annexes) pour ne garder que "assign" et "po" ?

Ensuite faudrait trouver un cas qui est ramené par le like et pas par le =
et afficher toutes les colonnes qui sont dans ta requete dans le SELECT
En fait le = ne retourne aucun tuples McM.
squallJ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 14h17   #8
Membre à l'essai
 
Inscription : mai 2005
Messages : 55
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2005
Messages : 55
Points : 22
Points : 22
Je viens de vérifié, assign ne contient pas de valeur NULL pour le m_post_id, le person_id et la table M_POSTES n'en contient pas non plus.

En fait Nous avons une base "bidev" avec un shema perallApp.
Il y a une autre base "devdb" avec les shemas Master et Perall.
Dans PerallApp de bidev, il y a toutes les procédures,fonctions,... et dans les shemas de devdb, il y a toute les datas.

PerallApp accède aux data grace à des synonyms contenant un dblink.
Style: synonym P_PERSONS FOR P_PERSONS@PERALL_DATA
synonym M_POSTES FOR M_POSTES@MASTER_DATA

Je viens de remarqué que lorsque j'exécute la requète sur "devdb" dans le shema Perall, cela fonctionne correctement.

Je ne sais pas si le fait de travaillé par dblink peut faire "déconné" le système mais il y a tout de même de drôle de réactions car
Si dans le code de la requète, on mets en commentaire
Code :
1
2
3
   AND TRUNC(NVL(bp.end_date,SYSDATE)) >= TRUNC(assign.start_date)
   AND TRUNC(bp.start_date) <= TRUNC(NVL(assign.end_date,SYSDATE))
   AND bp.absence_tp_id = a.absence_tp_id(+)
cela fonctionne correctement et comme je le disai au début, si on ne met pas ses lignes en commentaire mais que l'on place un LIKE pour les m_post_id , on obtient le résultat voulu.
squallJ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 14h41   #9
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par plaineR
Non tu vas obtenir une erreur ORA-01722 - Invalid number
en principe il est capable de faire la conversion comme un grand mais on remplace 'NULL' par -1 est c'est réglé
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 14h44   #10
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
c'est bien du number pas du varchar ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 15h09   #11
Membre à l'essai
 
Inscription : mai 2005
Messages : 55
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2005
Messages : 55
Points : 22
Points : 22
Oui , c'est bien du Number(6) pour tout les id.
Mais c'est comme j'écrivais plus haut, suivant le shéma dans lequel j'exécute cette requète, cela fonctionne bien ou pas.

Donc je vais un peu demandé demain matin au DBA comment cela peut-il se produire.

Merci quand même pour votre investissement.
Si j'ai une solution , je la posterai.
squallJ 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 04h58.


 
 
 
 
Partenaires

Hébergement Web