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 :

PL/SQL ORA-01722: Nombre non valide


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 14
    Points
    14
    Par défaut PL/SQL ORA-01722: Nombre non valide
    Bonjour à tous

    Je dois convertir certaines données et je tombe sur une erreur ORA-01722: Nombre non valide

    Le soucis, c'est que dans ma table source, si je fait un to_number du champs en question (CODVALQUAL), je n'ai pas d'erreur.

    En fait, c'est mon bloc PL/SQL qui provoque cette erreur, mais si je passe directement la requete en question en SQL, je n'ai aucune erreur

    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
    cursor c_qee_valqual_2
    	is
    		select distinct qee.CODPARSANDRE
    		from QEE_VALQUAL_SUPPL qee;
     
    BEGIN
     
    for l_qee_valqual_2 in c_qee_valqual_2
    	loop
     
     
    	insert into QEE_VALPARAMQUAL (CODPARAM, CODVALQUAL, LIBVALQUAL, NUMORDRE)
    		select tmp.CODPARSANDRE, tmp.CODVALQUAL, tmp.LIBVALQUAL, rownum 
    		from (select qee.CODPARSANDRE, qee.CODVALQUAL, qee.LIBVALQUAL
    		from QEE_VALQUAL_SUPPL qee where qee.CODPARSANDRE = l_qee_valqual_2.CODPARSANDRE order by to_number(replace(qee.CODVALQUAL,',','.')) asc) tmp ;
     
    	end loop; 
     
    END ;

    j'ai 473 occurences de CODPARSANDRE et cela plante sur une dizaine....mais je ne sais absolument pas pourquoi....

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Quels sont les types des colonnes des tables QEE_VALPARAMQUAL et QEE_VALQUAL_SUPPL ?

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Quels sont les types des colonnes des tables QEE_VALPARAMQUAL et QEE_VALQUAL_SUPPL ?
    Toutes les colonnes des tables QEE_VALPARAMQUAL et QEE_VALQUAL_SUPPL sont de format VARCHAR2, sauf NUMORDRE qui est de type NUMBER(5).

    J'ai beau retourner le problème dans tous les sens, je ne vois pas ce qui provoque cette erreur.
    J'ai catché l'exception (sur une dizaine de valeurs de CODPARSANDRE comme '1010', '1011', etc) et si je copie-colle l'insert en remplacant le filtre par '1010' par exemple, ça ne plante pas et l'insert se fait)

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Comment sont réalisées les connexions pour exécuter le code PL/SQL et pour exécuter le code SQL ?
    Peut être que les sessions SQL et PL/SQL ne sont pas configurés de la même manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * 
      from nls_session_parameters
     where parameter = 'NLS_NUMERIC_CHARACTERS'
    Il est préférable de préciser le NLS_NUMERIC_CHARACTERS dans le TO_NUMBER plutôt que de passer par un replace.
    Le replace peut cependant être quand même nécessaire si les les valeurs n'ont pas un séparateur homogène.
    Mais je préciserais quand même le NLS_NUMERIC_CHARACTERS après conversion du séparateur.

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Merci Skuatamad, ça doit venir de ça.
    Sur ma session SQL, j'ai le '.' comme NLS_NUMERIC_CHARACTERS alors que sur la database c'est ','

    le champs que je dois convertir pour effectuer un tri est toujours de la forme '1,1', '1' ou '1,11' par exemple.
    Qu'est-ce que je dois utiliser comme syntaxe pour que mon code PL/SQL passe sans soucis ?

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Vous pouvez le coder dans TO_NUMBER mais de ce fait le format devient obligatoire, ce qui n'est pas toujours très pratique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TO_NUMBER('1267,4', '999999999D999', 'NLS_NUMERIC_CHARACTERS = '',.''')
    Vous pouvez aussi fixer le séparateur dans votre procédure en changeant la session :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute immediate 'alter session set NLS_NUMERIC_CHARACTERS='', ''';
    Puis revenir au sépareur de base en fin de procédure si vous ne souhaitez modifier ce paramétrage que pour cette procédure.

    Évidemment, idéalement vous devriez modifier le type de la colonne en NUMBER.

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Merci beaucoup skuatamad !

    j'ai inséré ce code dans mon script et tout passe sans soucis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute immediate 'alter session set NLS_NUMERIC_CHARACTERS=''. ''';

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ORA-01722: Nombre non valide + sqlloader
    Par damiano84 dans le forum SQL*Loader
    Réponses: 9
    Dernier message: 20/05/2022, 20h09
  2. [Batch] ORA-01722: Nombre non valide
    Par informatica1989 dans le forum Spring
    Réponses: 2
    Dernier message: 02/05/2014, 10h50
  3. ORA-01722: Nombre non valide
    Par asouquieres dans le forum SQL
    Réponses: 3
    Dernier message: 13/07/2010, 15h12
  4. ORA-01722: Nombre non valide
    Par misa dans le forum Oracle
    Réponses: 4
    Dernier message: 18/12/2007, 15h23
  5. [SQLLDR]ORA-01722: Nombre non valide
    Par syl2095 dans le forum Oracle
    Réponses: 5
    Dernier message: 22/05/2006, 15h42

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