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 :

[Oracle PL/SQL] Erreur 01722


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut [Oracle PL/SQL] Erreur 01722
    Bonjour,

    j'utilise un package ORACLE (appelé par une appli NSDK pour info ...)
    Il se trouve qu'à l'appel d'une procédure, j'ai eu le message d'erreur suivant :
    ORA-01722: invalid number

    Le truc bizarre c'est que l'exécution générait l'erreur au 1er appel de la procédure mais marchait à partir du second appel

    Du coup, renseignements pris j'ai ajouté le code suivant en début de procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DBMS_SESSION.set_nls ('NLS_NUMERIC_CHARACTERS', '''.,''');
    Et à présent l'exécution marche au premier appel mais plante à partir du second

    Bref je ne vois plus de solution à mon problème et je vous le soumet dans l'espoir de trouver une personne compétente qui saura m'éclairer

    MERCI !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    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 135
    Par défaut
    En postant sur le forum Oracle, tu aurais plus de chance d'avoir des réponses.
    Ton problème n'a rien à voir avec le langage SQL
    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.

  3. #3
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Comment exécutes-tu ta procédure ? Sous SQL*Plus ? Si non, qu'est-ce que cela donne sous SQL*Plus ? Peux-tu nous mettre le code qui génère cette erreur ?

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Utiliser DBMS_SESSION à chaque appel de procédure me semble inapproprié, car cela revient à faire un ALTER SESSION à chaque appel, ce qui est lourd (un ALTER SESSION est sensé n'être effectué qu'une fois par session a priori).

    Le mieux est de préciser dans la fonction de conversion TO_NUMBER (car je suppose que c'est une conversion de string vers nombre) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TO_NUMBER(strVar, strFormat, 'NLS_NUMERIC_CHARACTERS = ''.,''')
    strVar est le string à convertir, strFormat est le format du nombre dans strVar.

    Cordialement,

    rbaraer

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    Citation Envoyé par plaineR
    Comment exécutes-tu ta procédure ? Sous SQL*Plus ? Si non, qu'est-ce que cela donne sous SQL*Plus ? Peux-tu nous mettre le code qui génère cette erreur ?
    Alors je n'utilise pas SqlPlus
    Je passe par une interface sous NSDK qui appelle ma procédure qui se trouve dans un package.
    De plus cette procédure est basée sur curseur ... bref beaucoup de code et je n'ai pas encore réussit à isoler exactement le(s) champ(s) problématiques car quand je catche l'erreur, le numéro de ligne renvoyé correspond à la fin de la procédure

  6. #6
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Ce que je te conseillerai pour localiser le problème :
    1. exécuter ta procédure sous SQL*Plus (pour voir si c'est lié à oracle ou à ton appli)
    2. repérer quelle ligne déclence l'erreur, pour cela recherche tous les to_number et les conversions implicites.

    NB : il est vrai que faire un DBMS_SESSION.set_nls dans ta procédure n'est pas une très bonne idée. Si tu n'as pas beaucoup de to_number, utilise la solution proposée par rbaraer. Sinon il vaut mieux mettre ton code dans la partie initialisation de ton package body (elle ne sera exécutée que la première fois que sera appelé ton package dans la session oracle et sera valable pour toute la session) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create or replace package body p1 as
      procedure p1 is
      begin
         ...
      end;
    begin
       DBMS_SESSION.set_nls ('NLS_NUMERIC_CHARACTERS', '''.,''');
    end;

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Citation Envoyé par plaineR
    Sinon il vaut mieux mettre ton code dans la partie initialisation de ton package body (elle ne sera exécutée que la première fois que sera appelé ton package dans la session oracle et sera valable pour toute la session) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create or replace package body p1 as
      procedure p1 is
      begin
         ...
      end;
    begin
       DBMS_SESSION.set_nls ('NLS_NUMERIC_CHARACTERS', '''.,''');
    end;
    Ah oui je ne savais pas que c'était possible. C'est effectivement une bonne solution !

    rbaraer

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    Citation Envoyé par plaineR

    NB : il est vrai que faire un DBMS_SESSION.set_nls dans ta procédure n'est pas une très bonne idée. Si tu n'as pas beaucoup de to_number, utilise la solution proposée par rbaraer. Sinon il vaut mieux mettre ton code dans la partie initialisation de ton package body (elle ne sera exécutée que la première fois que sera appelé ton package dans la session oracle et sera valable pour toute la session) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create or replace package body p1 as
      procedure p1 is
      begin
         ...
      end;
    begin
       DBMS_SESSION.set_nls ('NLS_NUMERIC_CHARACTERS', '''.,''');
    end;
    J'ai fait la modif comme indiqué ci dessus
    Sinon ça y est j'ai réussit à isoler la commande problématique, et il s'agit du BULK COLLECT de mon curseur, lequel ne renvoie que des données de type ... VARCHAR

    Je suis perplexe

Discussions similaires

  1. Procédure SQL ERREUR ORACLE
    Par wi2611 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 08/08/2007, 17h40
  2. Réponses: 1
    Dernier message: 13/06/2006, 15h11
  3. Réponses: 6
    Dernier message: 08/06/2004, 14h51
  4. portage oracle pl/SQL -> PostGreSQL
    Par luta dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 26/05/2004, 11h40
  5. PHP + Oracle + PL/ SQL
    Par bchristo dans le forum SQL
    Réponses: 12
    Dernier message: 28/04/2004, 15h49

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