Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour 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 14/11/2011, 08h16   #1
Membre chevronné
 
Avatar de pinocchio
 
Homme François
Développeur informatique
Inscription : novembre 2002
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 35
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : novembre 2002
Messages : 773
Points : 787
Points : 787
Par défaut Raise_application_error en erreur

Bonjour,
Lorsque je crée la procédure ci-dessous :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE OR REPLACE  PROCEDURE "VERIF_ETAT"  (
  NewEtat IN Varchar2
) IS
  ErrCode number;
begin
     IF(NewEtat='XX' OR NewEtat='YY' OR NewEtat IS NULL OR NewEtat='') then
        ErrCode :=0;
		    Raise_application_error(-20000,'OK');
     else
        ErrCode :=1;
		    Raise_application_error(-20000,'Etat non correct');
     end IF;
exception
when others then
        ErrCode :=1;
		Raise_application_error(-20000,'non modifié');
end;
Quelque soit NewEtat, je me retrouve à passer dans le exception when others et avec une erreur sur le Raise_application_error.
Pour faire des tests, j'utilise DBMS_OUTPUT.PUT_LINE et là aucun souci, je passe bien dans le if ou le else selon la valeur de NewEtat.
Auriez-vous une explication à cette erreur, s'il vous plait?
Cordialement
Pinocchio
__________________
La SNCF est mon ami
blog PARIS-GRANVILLE
Inscription au panel IPSOS (possibilité d'avoir des bons d'achats)
pinocchio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 10h16   #2
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
Il est normal quand tu lève une exception avec raise_application_error de passer ensuite dans le "when other", qui intercepte toutes les exceptions ...
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 10h25   #3
Membre chevronné
 
Avatar de pinocchio
 
Homme François
Développeur informatique
Inscription : novembre 2002
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 35
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : novembre 2002
Messages : 773
Points : 787
Points : 787
Merci, je n'y avais pas pensé.
Est-il possible de ne pas aller plus loin dans la procédure à partir du moment où l'on a rencontré un raise_application_error?
__________________
La SNCF est mon ami
blog PARIS-GRANVILLE
Inscription au panel IPSOS (possibilité d'avoir des bons d'achats)
pinocchio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 10h37   #4
Membre expérimenté
 
François
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 306
Points : 536
Points : 536
La vraie question, c'est est-ce que le when other est necessaire?
On va soit dans le if, soit dans le else. Je ne vois pas de raison d'aller ailleurs. [Mais je me trompe souvent ]

Par contre, le test NewEtat is null OR NewEtat='' c'est blanc bonnet et
bonnet blanc.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
TMP@minilhc >declare
  2     a varchar2(20);
  3     procedure test_nullite(p_vc varchar2) IS
  4     begin
  5        IF(p_vc IS NULL) then
  6           dbms_output.put_line('parameter is null');
  7        else
  8           dbms_output.put_line('parameter is not null ['||p_vc||']');
  9        end IF;
 10     end;
 11  begin
 12     test_nullite(a);
 13
 14     a:='a';
 15     test_nullite(a);
 16
 17     a:='';
 18     test_nullite(a);
 19
 20     a:='a';
 21     test_nullite(a);
 22
 23     a:=NULL;
 24     test_nullite(a);
 25
 26
 27  end;
 28  /
parameter IS NULL
parameter IS NOT NULL [a]
parameter IS NULL
parameter IS NOT NULL [a]
parameter IS NULL
 
PL/SQL procedure successfully completed.
 
Elapsed: 00:00:00.03
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 10h45   #5
Membre chevronné
 
Avatar de pinocchio
 
Homme François
Développeur informatique
Inscription : novembre 2002
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 35
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : novembre 2002
Messages : 773
Points : 787
Points : 787
Merci pour le null ou '' , j'ai toujours traité cela de manière différente et dans ce cas là à tort.

Pour le if et le else, j'étais parti du principe, et encore une fois à tort, que si NewEtat était autre chose qu'une chaine de caractère, ce serait ni dans le if ni dans le else et donc que je le récupèrerai dans le when others.

Merci pour toutes ces précisions.


Ma question sur la sortie prématurée reste valable car je vais avoir d'autres procédures avec plus de test et par sécurité, je mettrai peut-être le when others
__________________
La SNCF est mon ami
blog PARIS-GRANVILLE
Inscription au panel IPSOS (possibilité d'avoir des bons d'achats)
pinocchio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 12h45   #6
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 545
Points : 7 545
Citation:
Envoyé par pinocchio Voir le message
Merci pour le null ou '' , j'ai toujours traité cela de manière différente et dans ce cas là à tort.
C'est toutefois une bonne habitude à conserver car tous les SGBD ne considèrent pas comme Oracle que '' IS NULL.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 14h04   #7
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 312
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 312
Points : 5 815
Points : 5 815
Citation:
Envoyé par al1_24 Voir le message
C'est toutefois une bonne habitude à conserver car tous les SGBD ne considèrent pas comme Oracle que '' IS NULL.
Vous voulez dire toutes les « SGBD qui peuvent exécuter du code PL/SQL », n’est pas vrai ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 16h56   #8
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 545
Points : 7 545
Citation:
Envoyé par mnitu Voir le message
Vous voulez dire toutes les « SGBD qui peuvent exécuter du code PL/SQL », n’est pas vrai ?
D'une part le test d'une chaîne vide peut être nécessaire dans une requête, pas uniquement dans du code procédural, d'autre part tout développeur peut être amené à travailler avec d'autres SGBD qu'Oracle, éventuellement simultanément.
C'est donc une bonne pratique de faire la distinction entre la chaine vide et NULL dans l'écriture de son code, même pour Oracle, afin de ne pas créer d’incompatibilités si le programme devait migrer vers un SGBD plus respectueux de la norme.

Ce n'est pas parce que le quincailler du coin de la rue n'a pas de vis de 35*5 que cela n'existe pas
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 11h25   #9
Membre chevronné
 
Avatar de pinocchio
 
Homme François
Développeur informatique
Inscription : novembre 2002
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 35
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : novembre 2002
Messages : 773
Points : 787
Points : 787
Dans d'autres procédures je voudrai tester en plus la date et c'est pour cela que j'utilise le "when others".
En effet, j'arrive pas à trouver comment effectuer un test de validité de ma date et récupérer lorsque c'est en erreur autrement que par :
Code :
1
2
3
4
5
6
exception
when others then
      IF SQLCODE='-1858' then  
      		Raise_application_error(-20000,'La date est en erreur');
      end IF; 
end;
Est-ce vraiment la bonne solution?
Cordialement
Et merci à vous pour vos réponses.
__________________
La SNCF est mon ami
blog PARIS-GRANVILLE
Inscription au panel IPSOS (possibilité d'avoir des bons d'achats)
pinocchio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 11h43   #10
Membre chevronné
 
Avatar de pinocchio
 
Homme François
Développeur informatique
Inscription : novembre 2002
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 35
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : novembre 2002
Messages : 773
Points : 787
Points : 787
Je viens de me rendre compte qu'il y a aussi l'erreur ORA-01847.

Y'en a-t-il d'autres erreurs pouvant provenir de

Code :
to_date(variable,'dd/mm/yyyy')
Y a-t-il une page web recensant l'ensemble des erreurs? Cela pourrai me permettre de moins vous poser de questions.


Ma procédure actuelle pour vérifier les dates est:
Code :
1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE  PROCEDURE "VERIF_DATE"  (
  iDate IN Varchar2
) IS
 vDate date;
begin
        vDate := TO_DATE(iDate, 'dd/mm/yy');
        ErrCode :=0;
exception
when others then
	Raise_application_error(-20000,'La date est en erreur');
 end;
Cordialement
__________________
La SNCF est mon ami
blog PARIS-GRANVILLE
Inscription au panel IPSOS (possibilité d'avoir des bons d'achats)
pinocchio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2011, 14h20   #11
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 312
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 312
Points : 5 815
Points : 5 815
Citation:
Envoyé par al1_24 Voir le message
D'une part le test d'une chaîne vide peut être nécessaire dans une requête, pas uniquement dans du code procédural, d'autre part tout développeur peut être amené à travailler avec d'autres SGBD qu'Oracle, éventuellement simultanément.
C'est donc une bonne pratique de faire la distinction entre la chaine vide et NULL dans l'écriture de son code, même pour Oracle, afin de ne pas créer d’incompatibilités si le programme devait migrer vers un SGBD plus respectueux de la norme.

Ce n'est pas parce que le quincailler du coin de la rue n'a pas de vis de 35*5 que cela n'existe pas
Oui c'est bien ça, sauf que pour Oracle c'est une connerie de tester le '' (que vous le fait en SQL ou PL/SQL)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
Connected TO Oracle DATABASE 10g Enterprise Edition Release 10.2.0.4.0 
Connected AS mni
 
SQL> SET serveroutput ON
SQL> 
SQL> Declare
  2    l_t varchar2(10) := '';
  3  Begin
  4    IF l_t = '' Then
  5      dbms_output.put_line(q'!l_t est ''!');
  6    Else
  7      dbms_output.put_line(q'!l_t n'est pas''!');
  8    End If;
  9  End;
 10  /
 
l_t n'est pas''
 
PL/SQL procedure successfully completed
 
SQL>
mnitu 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 09h32.


 
 
 
 
Partenaires

Hébergement Web