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 :

Problème Erreur ORA-01722 opération sur un champ VARCHAR(13)


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Webmarketer
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Webmarketer

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Par défaut Problème Erreur ORA-01722 opération sur un champ VARCHAR(13)
    Bonjour tous le monde,

    Je suis débutant en SQL et dans le cadre de mon boulot j'ai une opération à faire sur une table (on contrôle une migration de données) et dans une de mes tables que nous appellerons table_A il y a un champ VARCHAR(13) qui contient un nombre décimal symbolisant une valeur en dedré sous cette forme : '48.76576' par exemple. Je souhaite UPDATE la table_A pour convertir les données de cette colonne en radian. Pour simplifier la formule je veux simplement multiplier par 0,017453293. En toute logique je dois je pense d'abord convertir la donnée de départ en nombre (puisqu'elle est stockée en VARCHAR) puis faire l'opération voulue sur le résultat de la conversion, et enfin repasser le tout en VARCHAR. Seulement ça ne marche pas : j'ai une erreur de type ORA-01722 : Nombre non valide.

    Voici la requète que j'essaye donc de passer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE table_A_
    SET colonne7 = CASE WHEN colonne7 IS NULL THEN NULL ELSE TO_CHAR(ROUND(TO_NUMBER(colonne7, '99D99999999999', 'NLS_NUMERIC_CHARACTERES=''.,''')*0.017453293,7),'0.999999') END;
    Merci d'avance pour vos réponses !

  2. #2
    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
    Es-tu certain de n'avoir fait aucune erreur dans ta formule au niveau des virgules ?
    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
    Candidat au Club
    Homme Profil pro
    Webmarketer
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Webmarketer

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Par défaut
    >> J'ai recopié trop vite, effectivement j'avais mis une virgule à la place d'un point mais pas sur mon environnement de travail.

    >> Je constate que sur 1 ligne cette requète fonctionne, pour moins de 100 000 lignes ça passe encore mais au delà ça plante et me met l'erreur que j'ai décrite plus haut. La table fait 3 millions de lignes

  4. #4
    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
    Il y a certainement une ou plusieurs lignes dans lesquelles le contenu de colonne7 ne correspond pas au format attendu et ne peut donc être converti en nombre.
    Essaye donc de rechercher les lignes où colonne7 contiendrait un caractère non numérique...
    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.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par JSWebandCom Voir le message
    >> Je constate que sur 1 ligne cette requète fonctionne, pour moins de 100 000 lignes ça passe encore mais au delà ça plante et me met l'erreur que j'ai décrite plus haut. La table fait 3 millions de lignes
    C'est que la base a rencontré une valeur non numérique qui fait planter la conversion.
    Implémentez cette fonction et utilisez-là pour identifier le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    create or replace function is_number (p$_str in varchar2)
    return number deterministic
    is
    begin
        return (to_number(p$_str, '99D99999999999', 'NLS_NUMERIC_CHARACTERS=''.,'''));
     
        exception when VALUE_ERROR then
            return null;
    end;
    /
     
    select *
      from table_A_
     where (select is_number(colonne7) from dual) is null;
    Vous pouvez alors corriger la donnée, corriger l'alimentation
    ou
    Faire vos mises à jour avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update table_A_
       set colonne7 = to_char(round((select is_number(colonne7) from dual) * 0.017453293, 7), '0.999999')
     where (select is_number(colonne7) from dual) is not null;

  6. #6
    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
    Ca ne change pas grande chose à l'affaire mais les bons conseils de programmation statuent d'intercepter juste les exceptions qu'on saurait traiter. Donc changé Others par Value_Error c'est un poil plus propre.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Tout à fait, je mets à jour mon code
    Une question mnitu, à votre avis pourquoi on ne peut pas attraper directement l'exception INVALID_NUMBER ?
    J'ai essayé et effectivement je lève une exception VALUE_ERROR.

  8. #8
    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 JSWebandCom Voir le message
    ... il y a un champ VARCHAR(13) qui contient un nombre décimal symbolisant une valeur en dedré sous cette forme : '48.76576' par exemple. Je souhaite UPDATE la table_A pour convertir les données de cette colonne en radian...
    Seulement ça ne marche pas : j'ai une erreur de type ORA-01722 : Nombre non valide.
    C'est le bonus collecté pour n'avoir pas utilisé un type de donnée approprié.

    Ne vous embêtez pas de gérer le nul il prend soin tout seul de lui.

Discussions similaires

  1. Erreur ORA-01722 sur un Insert
    Par Unsurgent dans le forum Oracle
    Réponses: 2
    Dernier message: 25/02/2011, 12h03
  2. opération sur des champs
    Par tonia1163 dans le forum IHM
    Réponses: 4
    Dernier message: 22/11/2008, 13h43
  3. ORA-00932 Replace sur un champ Long impossible ?
    Par Phénélas dans le forum Oracle
    Réponses: 5
    Dernier message: 16/01/2007, 11h53
  4. opération sur des champs déjà manipulés
    Par fred23195 dans le forum SQL Procédural
    Réponses: 10
    Dernier message: 23/08/2006, 16h16

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