Un très facile pour quelqu'un, L'encart suivant me donne le
ORA-01722: numéro invalide
Pourquoi?
INSERT INTO CUSTOMER VALUES (1,'MALADY','Claire','27 Smith St Caulfield','0419 853 694');
INSERT INTO CUSTOMER VALUES (2,'GIBSON','Jake','27 Smith St Caulfield','0415 713 598');
INSERT INTO CUSTOMER VALUES (3,'LUU','Barry','5 Jones St Malvern','0413 591 341');
INSERT INTO CUSTOMER VALUES (4,'JONES','Michael','7 Smith St Caulfield','0419 853 694');
INSERT INTO CUSTOMER VALUES (5,'MALADY','Betty','27 Smith St Knox','0418 418 347');
CUSTOMER
? Vous n'avez donné que la moitié des informations nécessaires.Réponses:
Une erreur ORA-01722 se produit lorsqu'une tentative est effectuée pour convertir une chaîne de caractères en un nombre et que la chaîne ne peut pas être convertie en un nombre.
Sans voir la définition de votre table, il semble que vous essayez de convertir la séquence numérique à la fin de votre liste de valeurs en un nombre, et les espaces qui la délimitent génèrent cette erreur. Mais sur la base des informations que vous nous avez fournies, cela peut se produire sur n'importe quel domaine (autre que le premier).
la source
Supposons que le numéro de téléphone soit défini comme
NUMBER
alors les espaces ne peuvent pas être convertis en nombre:Ce qui précède vous donne un
la source
Voici une façon de le résoudre. Supprimez les caractères non numériques, puis convertissez-les en nombre.
la source
Comme cette erreur survient lorsque vous essayez d'insérer une valeur non numérique dans une colonne numérique de db, il semble que votre dernier champ soit numérique et que vous essayez de l'envoyer sous forme de chaîne dans la base de données. vérifiez votre dernière valeur.
la source
Eh bien, cela peut aussi être:
où pour la concaténation dans oracle est utilisé l'opérateur
||
non+
.Dans ce cas, vous obtenez:
ORA-01722: invalid number ...
la source
Ceci est dû au fait:
Comme expliqué dans:
Pour résoudre cette erreur:
la source
Oracle effectue une conversion automatique String2number , pour les valeurs de colonne String ! Cependant, pour les comparaisons textuelles en SQL, l'entrée doit être délimitée comme une chaîne de manière explicite: La conversion opposée number2String n'est pas effectuée automatiquement, pas au niveau de la requête SQL.
J'ai eu cette requête:
Celui-là posait un problème:
Error: ORA-01722: invalid number
Je viens d'entourer les valeurs "numériques" , pour en faire des 'chaînes' , en les délimitant simplement :
... et voilà: il renvoie le résultat attendu.
edit: Et en effet: le col
acc_num
dans ma table est défini commeString
. Bien que non numérique, le ainvalid number
été signalé. Et la délimitation explicite des numéros de chaîne a résolu le problème.D'autre part, Oracle peut traiter les chaînes comme des nombres. Ainsi, les opérations / fonctions numériques peuvent être appliquées sur les chaînes, et ces requêtes fonctionnent:
la source
Dans mon cas, l'erreur de conversion était dans l' index fonctionnel , que j'avais créé pour la table.
Les données insérées étaient correctes. Il m'a fallu un certain temps pour comprendre que l'erreur réelle provenait de l'index de buggy.
Ce serait bien, si Oracle avait pu donner un message d'erreur plus précis dans ce cas.
la source
Si vous faites une
insert into...select * from...
déclaration, il est également facile d'obtenir l'erreur «Nombre invalide».Disons que vous avez une table appelée
FUND_ACCOUNT
qui a deux colonnes:Et disons que vous souhaitez modifier le OFFICE_ID pour qu'il soit numérique, mais qu'il existe des lignes existantes dans la table, et pire encore, certaines de ces lignes ont une valeur OFFICE_ID de '' (vide). Dans Oracle, vous ne pouvez pas modifier le type de données d'une colonne si la table contient des données, et il faut un peu de ruse pour convertir un «» en un 0. Alors, voici comment procéder:
CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
DELETE FROM FUND_ACCOUNT;
Lorsqu'il n'y a pas de données dans la table d'origine, modifiez le type de données de sa colonne OFFICE_ID:
ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);
Mais alors voici la partie délicate. Étant donné que certaines lignes contiennent des valeurs OFFICE_ID vides, si vous effectuez une opération simple
INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2
, vous obtiendrez l'erreur «ORA-01722 Numéro invalide». Afin de convertir les OFFICE_ID (vides) en 0, votre instruction d'insertion devra ressembler à ceci:INSERT INTO FUND_ACCOUNT (AID_YEAR, OFFICE_ID) SELECT AID_YEAR, decode(OFFICE_ID,' ',0,OFFICE_ID) FROM FUND_ACCOUNT2;
la source
Cela m'est arrivé aussi, mais le problème était en fait différent: le codage des fichiers .
Le fichier était correct, mais le codage du fichier était incorrect. Il a été généré par l'utilitaire d'exportation de SQL Server et je l'ai enregistré sous Unicode.
Le fichier lui-même avait l'air bien dans l'éditeur de texte, mais lorsque j'ai ouvert le
*.bad
fichier généré par le chargeur SQL * avec les lignes rejetées, j'ai vu qu'il y avait de mauvais caractères entre chaque caractère original. Puis j'ai réfléchi à l'encodage.J'ai ouvert le fichier original avec Notepad ++ et je l'ai converti en ANSI, et tout s'est chargé correctement.
la source
L'erreur ORA-01722 est assez simple. Selon Tom Kyte :
Cependant, où se situe le problème n'est souvent pas apparent au début. Cette page m'a aidé à dépanner, trouver et résoudre mon problème. Astuce: recherchez les endroits où vous convertissez explicitement ou implicitement une chaîne en nombre. (J'avais
NVL(number_field, 'string')
dans mon code.)la source
essayez ceci aussi, lorsque vous avez une erreur de numéro invalide
Dans ce a.emplid est number et b.emplid est un varchar2 donc si vous devez convertir l'un des côtés
où to_char (a.emplid) = b.emplid
la source
Vous pouvez toujours utiliser la fonction TO_NUMBER () afin de supprimer cette erreur. Cela peut être inclus comme INSERT INTO employés phone_number valeurs (TO_NUMBER ('0419 853 694');
la source