IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Raise_application_error en erreur


Sujet :

SQL Oracle

  1. #1
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Par défaut Raise_application_error en erreur
    Bonjour,
    Lorsque je crée la procédure ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    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 ...

  3. #3
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Par défaut
    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?

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Par défaut
    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

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    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
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    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 ?

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    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
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  10. #10
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  11. #11
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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>

Discussions similaires

  1. Erreur fréquente avec ASP et IIS
    Par Community Management dans le forum ASP
    Réponses: 2
    Dernier message: 11/02/2004, 22h20
  2. Check Url pour savoir si erreur 404 ou si le site existe
    Par Clément[Delphi] dans le forum Composants VCL
    Réponses: 2
    Dernier message: 07/08/2002, 13h49
  3. Réponses: 2
    Dernier message: 27/05/2002, 19h46
  4. erreur IDL:omg.org/CORBA/MARSHAL:1.0
    Par Pinggui dans le forum CORBA
    Réponses: 3
    Dernier message: 13/05/2002, 15h05
  5. [Kylix] Erreur objet
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo