Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1645 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Oracle 10g] Utilisation d'une fonction packagée ds un NOT EXISTS

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Oracle 10g] Utilisation d'une fonction packagée ds un NOT EXISTS

n°1848072
loursbleu
satisfait ou remboursé
Posté le 06-02-2009 à 16:37:01  profilanswer
 

salut à tous,  :hello:  
 
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??  :jap:  
 
Merci.


---------------
l'ours bleu
mood
Publicité
Posté le 06-02-2009 à 16:37:01  profilanswer
 

n°1848584
moi23372
Posté le 08-02-2009 à 14:05:36  profilanswer
 

é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.


---------------
quand un homme raisonne mal c'est qu'il n'a pas les données pour raisonner mieux (diderot)
n°1849034
loursbleu
satisfait ou remboursé
Posté le 09-02-2009 à 16:37:07  profilanswer
 

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...

n°1849287
Mara's dad
Yes I can !
Posté le 10-02-2009 à 09:09:43  profilanswer
 

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 ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°1852930
MagicBuzz
Posté le 19-02-2009 à 13:19:00  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Oracle 10g] Utilisation d'une fonction packagée ds un NOT EXISTS

 

Sujets relatifs
problème avec oracleRécupération des données (curseur) d'une fonction oracle
Récupérer un tableau d'une fonctionoracle et HSQL
[PL/SQL Oracle] If qui s'appuie sur un select ?Intégrer 2 animation flash en fonction des paramètres de l'url
Intégrer 2 animation flash en fonction des paramètres de l'urlAS2 : faire un "callback" dans une fonction
interet fonction void 
Plus de sujets relatifs à : [Oracle 10g] Utilisation d'une fonction packagée ds un NOT EXISTS


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR