Utilisation d'une fonction packagée ds un NOT EXISTS [Oracle 10g] - SQL/NoSQL - Programmation
Marsh Posté le 08-02-2009 à 14:05:36
étrange en effet.
as tu essayé avec la clause NOT IN pour voir si ce problème arrive également.
Personnellement, je ne comprends pas trop l'intéret de la table DUAL. C'est une rustine pour contourner un bug du système à mon avis. Visiblement, l'ordre des opérations n'est plus la même d'une version à l'autre. Ce qui est plus qu'inquiétant étant donné que toute migration de 9 vers 10 pourrait ne plus ramener les mêmes résultats.
Marsh Posté le 09-02-2009 à 16:37:07
Je n'ai pas essayé avec un NOT IN. J'ai également pu contourner en encapsulant la clause utilisant la fonction dans un EXISTS du type
AND EXISTS (select 1
from dual
where mon_pack.fonction = 'O').
Je suis d'accord avec toi sur le fait qu'il soit inquiétant que le résultat diffère entre 2 versions d'Oracle car j'ai utilisé moultes requêtes de ce type dans différents programmes...
Marsh Posté le 10-02-2009 à 09:09:43
C'est quoi "le résultat escompté", je ne suis pas sûr de deviner ce que tu attends en lisant la suite, surtout que ça dépends aussi des data ?
Par exemple, la requête "select sysdate from dual where 1=2" ne remonte aucune ligne, donc sur cette requête, EXISTS est faux et NOT EXISTS est vrai.
Donc :
"select sysdate from dual where not exists ( select sysdate from dual where 1=2 )" retourne sysdate. (Vérifié sur oracle 10.2.0.2)
et
"select sysdate from dual where not exists ( select sysdate from dual where 1=1 )" ne retourne rien. (Vérifié sur oracle 10.2.0.2)
Est-ce qu'avec ces requêtes Oracle 9 et 10 ont le même comportement ?
Est-que le problème n'arrive qu'avec mon_pack.fonction = 'O', ou est-ce identique avec 1=1 ou 1=2 ?
Quel est le comportement interne de mon_pack.fonction ?
Es-tu certain (vraiement) d'avoir les mêmes données dans tes deux bases ?
Marsh Posté le 19-02-2009 à 13:19:00
euh, juste comme ça, quand on a un truc dans le FROM, on n'a pas besoin de rajouter en plus DUAL.
DUAL, ça sert juste quand on n'a pas de table ou d'expression à mettre dans le FORM. sinon, ça sert absolument à rien. et dans le cas précis, faire une jointure dessus, à mon avis c'est le meilleur moyen, pour se retrouver avec des lignes indésirées par erreur.
Marsh Posté le 06-02-2009 à 16:37:01
salut à tous,
je cherche une explication à un résultat de requête.
J'ai la requête suivante (simplifiée)
select valeur1, valeur2
from ma_table mt1
where valeur1 like 'A%'
and not exists (select 1
from ma_table2 mt2
where mt2.valeur1 = mt1.valeur1
and mon_pack.fonction = 'O')
Mon problème est qu'une requête de ce type ne ramène pas le même résultat entre Oracle 9 et Oracle 10.
Ce qui pose problème est l'appel à une fonction packagée dans le NOT EXISTS.
Avec Oracle 10 (10.2.0.3), si mon_pack.ma_fonction ramène 'O', alors il n'y a pas de problème, j'ai le résultat escompté.
Par contre, si mon_pack.ma_fonction ramène toute autre valeur, dans tous les cas, la requête ne ramènera rien, c'est comme si la clause sur mon_pack.ma_fonction se trouvait au niveau supérieur et pas dans le sous select.
J'ai résolu le problème en réécrivant la requête de la façon suivante :
select valeur1, valeur2
from ma_table mt1
where valeur1 like 'A%'
and not exists (select 1
from ma_table2 mt2, dual
where mt2.valeur1 = mt1.valeur1
and mon_pack.fonction = 'O')
En un sens cette syntaxe paraît logique, on utilise la table dual pour éxécuter la fonction. Néanmoins je suis surpris de la différence d'interprétation entre Oracle 9i et Oracle 10g.
En espérant avoir été clair, si quelqu'un a une explication??
Merci.
---------------
l'ours bleu