|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : février 2007 Messages : 26 ![]() |
Bonjour à tous,
J' ai un problème pour gérer une éxception dans une fonction en PL/SQL. Ma fonction parcours une table, doit me selectionner la plus grande date contenue dans cette table pour un client donné et la soustraire à la date du jour. Le code de cette fonction marche tres bien quand je l'appelle en JAVA. Le problème, c'est quand le client n'est pas encore dans la table, c'est-à-dire qu'il n'y a pas de date lui corréspondant, un éxception est levée sous Eclipse, qui m'indique qu'aucune valeur n'est retournée, mais le programme continu à tourner sans problème. Je voudrais qu'il n'y ait plus d'affichage. C'est pourquoi j'ai décidé de gérer l'éxception en PL/SQL. Voici mon code : Code :
J'aimerais savoir si l'erreur vient de la synthaxe de mon éxception ou si elle est male placée... |
||
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
il manque un RETURN presant non ?
Sinon, à ce que je vois l'exception ne se déclenchera jamais c'est monC%ROWCOUNT éventuellement que tu devrais utiliser. PS : presant s'écrit present |
|
|
00
|
|
|
#3 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 319 ![]() |
Trop de code, trop des variables, trop des exceptions, etc.
L'exception NO_DATA_FOUND n'est jamais levé pour un curseur, il faut faire un «*select ... into*» pour ça. Select Max(...) permet d'obtenir la plus grande date par client pas besoin de recoder l'algorithme. Vue le code que vous avez posté vous avez du travaille à faire avec SQL |
|
|
00
|
|
|
#4 | ||
|
Invité de passage
![]() Inscription : février 2007 Messages : 26 ![]() |
Le problème pour le select MAX, c'est que j'ai stockée les date en CHAR dans la table et non pas en DATE, c'est pourquoi j'utilise un tableau pour convertir les CHAR en DATE. Maintenant, est-ce que la fonction MAX marche aussi avec les variables de tye CHAR.
Sinon orafrance, j'ai essayé d'utilisé monC%ROWCOUNT comme ceci : Code :
|
||
|
|
00
|
|
|
#5 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
et MAX(TO_DATE(colonne)) ? T'es juste en train de réinventer la roue
|
|
|
00
|
|
|
#6 |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
|
|
|
00
|
|
|
#7 | |||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 319 ![]() |
Citation:
Bon tu progresse déjà il n’y plus l’exception NO_DATA_FOUND. Elimine le tableau tabData, le variables i, k, temp, employe Max et tu verra. |
|||
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 453 ![]() |
Le mieux est de tout faire dans 1 select
Il faut bien déterminer les règles : De ce que j'ai vu, il y a 3 valeurs de retour 0 Si pas de ligne -1 Si le max date de plus de 1 jour 1 Si le max date de moins de 1 jour (ou plus tard qu'aujourdh'ui) Un petit decode pour sortir ça. Avec Count(*) pour avoir le nb de lignes Sign(a-b) qui renvoit 1 sur a>b Max(to_date(date_en_char, 'DD/MM/YYYY')) Ou alors utiliser un CASE (Plus simple à coder et à lire)
__________________
More Code : More Bugs. Less Code : Less Bugs |
|
|
00
|
|
|
#9 | ||
|
Invité de passage
![]() Inscription : février 2007 Messages : 26 ![]() |
C'est bon j'ai reussi a résoudre mon problème. J'ai utilisé ce que m'a dit orafrance, j'ai fait un MAX(TO_DATE(colonne)), ce qui a grandement simplifiée ma requête. Merci a tous pour votre aide.
Voici mon code final: Code :
|
||
|
|
00
|
|
|
#10 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 319 ![]() |
Il reste encore trop des variables et trop de code. Nvl permet de traiter les nulles, Decode ou Case permet de éliminer les If et le Begin suivi de Declare et de Begin laisse une mauvais impression.
|
|
|
00
|
|
|
#11 | ||
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 453 ![]() |
Code :
__________________
More Code : More Bugs. Less Code : Less Bugs |
||
|
|
00
|
|
|
#12 | |||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 319 ![]() |
Citation:
|
|||
|
|
00
|
|
|
#13 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 453 ![]() |
__________________
More Code : More Bugs. Less Code : Less Bugs |
|
|
00
|
|
|
#14 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 319 ![]() |
TKyte
Citation:
|
|
|
|
00
|
|
|
#15 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Comme je l'ai déjà dit, c'est très pratique pour faire un trigger ON_LOGON et qu'on ne souhaite pas qu'une exception imprévu interdise la connexion. C'est certes pas très joli mais certaines sociétés ne peuvent pas se permettre d'avoir des dysfonctionnements lourd de conséquence à cause d'un bug mineur... le NULL par contre est pas top, vaut mieux logguer l'info quelquepart (l'alert.log par exemple) pour pallier à une carence du code
|
|
|
00
|
|
|
#16 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 319 ![]() |
Citation:
|
|
|
|
00
|
|
|
#17 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
c'est beau de savoir développer une solution bugless du 1° coup en prod
![]() sur les bases de test t'as rarement les mêmes conditions d'utilisation qu'en prod notamment en ce qui concerne les connexions |
|
|
00
|
|
|
#18 | |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 319 ![]() |
Citation:
Mais si on emploie WHEN OTHERS THEN NULL on peut bien dire que ce code ne sert à rien parfois, c’est à dire quand une exception arrive, et donc logiquement s’en passer tranquillement. |
|
|
|
00
|
|
|
#19 | |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Citation:
Mais je confirme qu'un envoie de message dans l'alerte log plutôt qu'un "bête" NULL est plus intéressant |
|
|
|
00
|
|
|
#20 | |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 453 ![]() |
Citation:
C'est un choix qu'on peut avoir ou pas.
__________________
More Code : More Bugs. Less Code : Less Bugs |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com