web-dev-qa-db-fra.com

Erreur SQL "ORA-01722: numéro invalide"

Un très facile pour quelqu'un, l'insert suivant me donne la

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');
87
Phillip Gibson

Une erreur ORA-01722 se produit lorsqu'une tentative de conversion d'une chaîne de caractères en un nombre est tentée et que la chaîne ne peut pas être convertie en un nombre.

Sans voir votre définition de table, il semble que vous tentiez de convertir la séquence numérique située à la fin de votre liste de valeurs en un nombre, et les espaces qui le délimitent génèrent cette erreur. Mais selon les informations que vous nous avez fournies, cela pourrait se produire dans n’importe quel domaine (autre que le premier).

110
Aaron

Supposons que le numéro de téléphone soit défini comme NUMBER alors les espaces ne peuvent pas être convertis en un nombre:

create table telephone_number (tel_number number);
insert into telephone_number values ('0419 853 694');

Ce qui précède vous donne une

ORA-01722: numéro invalide

22
hol

Voici un moyen de le résoudre. Supprimez les caractères non numériques, puis transformez-le en nombre.

cast(regexp_replace('0419 853 694', '[^0-9]+', '') as number)
14
gmlacrosse

Lorsque cette erreur survient lorsque vous essayez d'insérer une valeur non numérique dans une colonne numérique de la base de données, il semble que votre dernier champ puisse être 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.

10
Freelancer

Et bien ça peut aussi être:

SELECT t.col1, t.col2, ('test' + t.col3) as test_col3 
FROM table t;

où pour la concaténation dans Oracle est utilisé l'opérateur || pas +.

Dans ce cas, vous obtenez: ORA-01722: invalid number ...

8
Lazar Lazarov

Ceci est dû au fait:

Vous avez exécuté une instruction SQL qui tentait de convertir une chaîne en nombre, mais sans succès.

Comme expliqué dans:

Pour résoudre cette erreur:

Seuls les champs numériques ou les champs de caractères contenant des valeurs numériques peuvent être utilisés dans des opérations arithmétiques. Assurez-vous que toutes les expressions correspondent à des nombres.

7
Mahmoud Gamal

J'ai eu cette requête:

select max(acc_num) from ACCOUNTS where acc_num between 1001000 and 1001999;

Celui-là a présenté un problème: Error: ORA-01722: invalid number

Je viens d’entourer les valeurs "numériques", pour les rendre 'Strings', et pour les rendre explicitement délimitées:

select max(acc_num) from ACCOUNTS where acc_num between '1001000' and '1001999';

... et voilà: il retourne le résultat attendu.

edit: Et en effet: le col acc_num de ma table est défini comme String. Bien que non numérique, le invalid number a été signalé. Et le délimitation explicite des numéros de chaîne a résolu le problème.

D'autre part, Oracle can traite les chaînes de caractères comme des nombres. Ainsi, les opérations/fonctions numériques peuvent être appliquées sur les chaînes, et ces requêtes fonctionnent:

sélectionnez max (string_column) dans TABLE;

sélectionnez string_column à partir de TABLE où string_column entre '2' et 'z';

sélectionnez string_column à partir de TABLE où string_column > '1';

sélectionnez string_column à partir de TABLE où string_column <= 'b';

3
Franta

Dans mon cas, l'erreur de conversion était dans index basé fonctionnel, que j'avais créé pour la table.

Les données insérées étaient OK. Il m'a fallu un certain temps pour comprendre que l'erreur réelle venait de l'index du buggy.

Ce serait bien si Oracle aurait pu donner un message d'erreur plus précis dans ce cas.

2
iTake

Si vous faites une déclaration insert into...select * from..., il est également facile d’obtenir l’erreur "Nombre invalide".

Disons que vous avez une table appelée FUND_ACCOUNT qui a deux colonnes:

AID_YEAR  char(4)
OFFICE_ID char(5)

Et supposons que vous souhaitiez que OFFICE_ID soit numérique, mais qu'il existe des lignes 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. La conversion d'un '' en 0 'nécessite donc quelques astuces. Voici comment procéder:

  1. Créez une table en double: CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
  2. Supprimer toutes les lignes de la table d'origine: DELETE FROM FUND_ACCOUNT;
  3. Une fois qu'il n'y a plus 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);

  4. Mais alors voici la partie la plus délicate. Certaines lignes contenant des valeurs OFFICE_ID vides, si vous effectuez un simple INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2, vous obtiendrez l'erreur "ORA-01722 Invalid Number". Afin de convertir les OFFICE_ID (vierges) en 0, votre instruction insert devra ressembler à ceci:

INSERT INTO FUND_ACCOUNT (AID_YEAR, OFFICE_ID) SELECT AID_YEAR, decode(OFFICE_ID,' ',0,OFFICE_ID) FROM FUND_ACCOUNT2;

1
Frank Staheli