|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre chevronné
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 984 ![]() |
Bonjour,
Faudrait que je m'y fasse au fait que sous Oracle, un "select field into" avec aucune donnée trouvée génère une exception NO_DATA_FOUND contrairement à SQL Server où on aurait juste un retour NULL !! Comment éviter cette exception alors ? Je me propose de faire un "select count(field)" et ne faire le "select field into" que si le comptage supérieur à 0: Code :
__________________
randriano.dvp.com |
||
|
|
00
|
|
|
#2 | ||
|
Membre éprouvé
![]() Inscription : juillet 2003 Messages : 538 ![]() |
Si tu es dans une procédure , pourquoi ne pas pas faire un bloc d'exeption WHEN_NO_DATA_FOUND ?
Code :
__________________
C'est pas parce que ca marche que c'est bon!! Pensez au bouton "Résolu" Je ne réponds pas en privé aux questions |
||
|
|
00
|
|
|
#3 |
|
Membre chevronné
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 984 ![]() |
En effet, je l'utilise dans une procédure mais je ne veux pas considérer le fait qu'il n'y a pas de donnée trouvée comme une erreur, il y a d'autres instructions qui suivent le SELECT !! Sous Access et Sql Server, c'est pas un problème donc je veux faire pareil
Il semble aussi qu'un select brut c-à-d pas dans une procédure génère aussi une exception quand il n'y a pas de donnée trouvée ??
__________________
randriano.dvp.com |
|
|
00
|
|
|
#4 | |
|
Membre éprouvé
![]() Inscription : juillet 2003 Messages : 538 ![]() |
Citation:
Apres le select et avant le bloc "EXCEPTION" tu peux mettre le traitement que tu veux ( qui ne se déclenchera donc pas quand il y'a pas de données)
__________________
C'est pas parce que ca marche que c'est bon!! Pensez au bouton "Résolu" Je ne réponds pas en privé aux questions |
|
|
|
00
|
|
|
#5 |
|
Membre chevronné
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 984 ![]() |
Les codes qui suivent le select doivent être après lui car ils vont utiliser les enregistrements resultants. C'est pour ça que je fais ce "select count" pour affecter une chaine vide au résultat si no data found
__________________
randriano.dvp.com |
|
|
00
|
|
|
#6 | ||
|
Membre éprouvé
![]() Inscription : juillet 2003 Messages : 538 ![]() |
Je redonne mon explication car a priori tu n'as pas compris ....
Code :
Si ton "select ...into" se passe correctement , la partie du traitement que tu auras ecrit se fera. Sinon => l'execution de ton traitement sautera il fera ce que tu as ecrit dans le "WHEN NO_DATA_FOUND" Ca revient à ce que tu as fait mais en plus propre, sans la requete de count en plus et te permettant de bien gerer l'exception comme tu le veux .
__________________
C'est pas parce que ca marche que c'est bon!! Pensez au bouton "Résolu" Je ne réponds pas en privé aux questions |
||
|
|
00
|
|
|
#7 | ||
|
Nouveau Membre du Club
![]() Inscription : novembre 2006 Messages : 113 ![]() |
Bonjour,
je pense qu'une instruction NVL peut te régler le problème donc tu vas mettre : Code :
|
||
|
|
00
|
|
|
#8 | ||
|
Expert Confirmé
![]() Chef de projet en SSII Inscription : janvier 2004 Messages : 2 866 ![]() |
Un petit exemple pour illustrer ce que t'a expliqué miloux32 :
Code :
NB : le count(*) est à proscrire pour des raisons de performance.
__________________
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. |
||
|
|
00
|
|
|
#9 | |||
|
Membre éprouvé
![]() Inscription : juillet 2003 Messages : 538 ![]() |
Citation:
et pourquoi faire un traitement sur une variable qui n'existe pas ? Et ca ne resoud pas le problème ,je crois... je ne suis pas sur qu'un nvl retourne une valeur quand la requete ne ramene rien ... exempl simple :
__________________
C'est pas parce que ca marche que c'est bon!! Pensez au bouton "Résolu" Je ne réponds pas en privé aux questions |
|||
|
|
00
|
|
|
#10 | ||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 319 ![]() |
Bon si tu y tiens vraiment
Code :
|
||
|
|
00
|
|
|
#11 | |||
|
Expert Confirmé
![]() Chef de projet en SSII Inscription : janvier 2004 Messages : 2 866 ![]() |
Citation:
![]() En plus les perf
__________________
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. |
|||
|
|
00
|
|
|
#12 |
![]() ![]() vincent rogier Inscription : juillet 2007 Messages : 2 355 ![]() |
La solution de miloux32 EST la façon la plus simple et la plus performante.
Je ne vois pas du tout pourquoi tu ne veux pas la mettre en œuvre !
__________________
Vincent Rogier. Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique ! OCILIB (C Driver for Oracle) Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle |
|
00
|
|
|
#13 |
|
Membre chevronné
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 984 ![]() |
Désolé pour le retard de ma réponse mais j'ai étudié la proposition de miloux32!
Le catch d'exception n'est-il pas unique pour chaque couple begin-end car en fait, si j'utilises un catch exception pour le SELECT INTO où vais-je placer le catch exception général ?? Mon soucis avec votre méthode c'est que la longueur du code va doubler car je devrais tout copier le code après SELECT dans le "When NO_DATA_FOUND then" pour le cas où aucune réponse ! En fait, un select hors procédure crée-t-il une exception ?
__________________
randriano.dvp.com |
|
|
00
|
|
|
#14 | ||
|
Membre éclairé
![]() Inscription : août 2005 Messages : 316 ![]() |
j'ai lu en biais les reponse , mais il me semble qu'il ne faut pas recopier tout
le code dans l'exception, il suffit de refaire un bloc begin end pour le select Code :
|
||
|
|
00
|
|
|
#15 | ||
|
Expert Confirmé Sénior
![]() ![]() ![]() Laurent SchneiderAdministrateur de base de données Inscription : décembre 2005 Messages : 2 927 ![]() |
éventuellement
Code :
|
||
|
00
|
|
|
#16 |
|
Membre chevronné
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 984 ![]() |
J'avais pensé à votre code c.langlet, donc si ça marche et ça marche, c'est la solution.
Pour votre code laurentschneider, c'est un autre moyen de faire comme sous Access, retourner une chaine vide lorsqu'aucun objet n'est trouvé. C'est aussi une autre solution !!!
__________________
randriano.dvp.com |
|
|
00
|
|
|
#17 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 319 ![]() |
|
|
|
00
|
|
|
#18 | ||||||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 319 ![]() |
Il existe toujours une autre technique pour éviter l'exception No_DATA_FOUND qui consiste toute simplement à remplacer le SELECT ... INTO ... FROM par un curseur explicite
Code :
A partir de cette idée il est possible d'utiliser la variante suivante: Code :
Code :
|
||||||
|
|
00
|
|
|
#19 |
|
Membre chevronné
![]() ![]() Rija RandrianoInscription : janvier 2007 Messages : 984 ![]() |
merci mnitu pour cette autre technique qu'est l'emploi de curseur explicite, c'est vraiment un autre moyen de contourner le traitement de l'exception no_data_found
__________________
randriano.dvp.com |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com