SQL-fout “ORA-01722: Ongeldig nummer”

Een zeer gemakkelijke voor iemand,
Het volgende inzetstuk geeft mij de

ORA-01722: ongeldig nummer

Waarom?

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');

Antwoord 1, Autoriteit 100%

Er treedt een ORA-01722-fout op wanneer een poging wordt gedaan om een ​​tekenreeks in een cijfer te converteren, en de tekenreeks kan niet worden geconverteerd in een getal.

Zonder uw tabeldefinitie te zien, lijkt het erop dat u probeert de numerieke sequentie aan het einde van uw waardenlijst naar een cijfer te converteren, en de spaties die deze fout laten zien. Maar op basis van de informatie die u ons hebt gegeven, kan het op elk gebied (anders dan de eerste) gebeuren.


Antwoord 2, Autoriteit 20%

Stel dat telefoonnummer wordt gedefinieerd als NUMBERDan kunnen de lege plekken niet worden omgezet in een cijfer:

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

Het bovenstaande geeft u een

ORA-01722: ongeldig nummer


Antwoord 3, Autoriteit 15%

Hier is een manier om het op te lossen. Verwijder niet-numerieke tekens en cast het dan als een getal.

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

Antwoord 4, Autoriteit 7%

Zoals deze fout komt wanneer u probeert niet-numerieke waarde in een numerieke kolom in DB in te voegen, lijkt het erop dat uw laatste veld misschien numeriek is en u probeert het als een tekenreeks in de database te verzenden. Controleer uw laatste waarde.


Antwoord 5, Autoriteit 7%

Nou, het kan ook zijn:

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

Waar voor aaneenschakeling in Oracle wordt gebruikt in de operator ||niet +.

In dit geval krijgt u: ORA-01722: invalid number ...


Antwoord 6, Autoriteit 5%

Dit is omdat:

U hebt een SQL-instructie uitgevoerd die probeerde een tekenreeks naar een te converteren
nummer, maar het was niet succesvol.

Zoals uitgelegd in:

Om deze fout op te lossen:

Alleen numerieke velden of tekenvelden met numerieke waarden
kan worden gebruikt in rekenkundige operaties. Zorg ervoor dat alle expressies
Evalueer naar cijfers.


Antwoord 7, Autoriteit 4%

Oracle doet Automatisch String2Number conversie, voor String Column Waarden! Voor de tekstuele vergelijkingen in SQL moet de inbreng echter uitdrukkelijk als een tekenreeks worden gescheiden: de tegenovergestelde conversienummer2Sstring wordt niet automatisch uitgevoerd, niet op het SQL-query-niveau.

Ik had deze query:

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

Die gaf een probleem: Error: ORA-01722: invalid number

Ik heb zojuist de “numerieke”waarden omcirkeld om ze ‘Strings’te maken, en ze gewoon expliciet gescheidente maken:

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

…en voilà: het geeft het verwachte resultaat.

bewerken:
En inderdaad: de col acc_numin mijn tabel is gedefinieerd als String. Hoewel niet numeriek, werd het invalid numbergerapporteerd. En de expliciete scheidingvan de tekenreeksnummers loste het probleem op.

Aan de andere kant, Oracle kanStrings als getallen behandelen. Dus de numerieke bewerkingen/functies kunnen worden toegepast op de Strings, en deze queries werken:

selecteer max(string_column) uit TABLE;

selecteer string_column uit TABLE waar string_column tussen‘2’ en ‘z’;

selecteer string_column uit TABLE waar string_column >‘1’;

selecteer string_column uit TABLE waar string_column <=‘b’;


Antwoord 8, autoriteit 2%

In mijn geval zat de conversiefout in functioneel gebaseerde index, die ik voor de tabel had gemaakt.

De gegevens die werden ingevoegd, waren in orde. Het kostte me een tijdje om erachter te komen dat de daadwerkelijke fout uit de buggy-index kwam.

Het zou fijn zijn als Oracle in dit geval een preciezere foutmelding had kunnen geven.


Antwoord 9

Als je een insert into...select * from...instructie doet, krijg je ook gemakkelijk de foutmelding ‘Ongeldig nummer’.

Stel dat u een tabel heeft met de naam FUND_ACCOUNTdie twee kolommen heeft:

AID_YEAR  char(4)
OFFICE_ID char(5)

En laten we zeggen dat u de Office_ID wilt wijzigen om numeriek te zijn, maar dat er bestaande rijen in de tafel zijn, en nog erger, sommige van die rijen hebben een Office_ID-waarde van ” (leeg). In Oracle kunt u het DataType van een kolom niet wijzigen als de tabel gegevens heeft, en het vereist een beetje bedrog om een ​​” naar een 0 te converteren, dus hier is hoe u het moet doen:

  1. Maak een dubbele tabel: CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
  2. Verwijder alle rijen van de originele tabel: DELETE FROM FUND_ACCOUNT;
  3. Als er geen gegevens in de originele tabel zijn, wijzigt u het gegevenstype van de kolom Office_ID: ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);

  4. Maar dan is het lastige deel. Omdat sommige rijen blanco Office_id-waarden bevatten, als u een eenvoudige INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2, krijgt u de fout “ORA-01722 ongeldige nummer”. Om de ” (blanco) Office_ids in 0’s te converteren, moet uw invoegverklaring er als volgt uitzien:

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


Antwoord 10

Dit gebeurde mij ook, maar het probleem was eigenlijk anders: bestandscodering .

Het bestand was correct, maar het bestandscodering was verkeerd. Het werd gegenereerd door het exportbruik van SQL Server en ik heb het als Unicode opgeslagen.

Het bestand zelf zag er goed uit in de teksteditor, maar toen ik de *.badBestand dat de SQL * -lader gegenereerd met de geweigerde lijnen, zag ik dat het slechte personages had tussen elk origineel personage . Dan over de codering.

Ik opende het originele bestand met Notepad++ en converteerde het naar ANSI, en alles werd correct geladen.


Antwoord 11

De ORA-01722-fout is vrij eenvoudig. Volgens Tom Kyte:

We hebben geprobeerd om een tekenreeks expliciet of impliciet om te zetten in een getal, maar dat mislukt.

Waar het probleem zich echter bevindt, is in eerste instantie vaak niet duidelijk. Deze paginaheeft me geholpen om mijn probleem op te lossen, te vinden en op te lossen. Tip: zoek naar plaatsen waar je expliciet of impliciet een string omzet in een getal. (Ik had NVL(number_field, 'string')in mijn code.)


Antwoord 12

probeer dit ook, als je een ongeldig nummer hebt,

In deze
a.emplid is nummer en b.emplid is een varchar2 dus als je een van de zijkanten moet converteren

waar to_char(a.emplid)=b.emplid


Antwoord 13

U kunt altijd de TO_NUMBER() functie gebruiken om deze fout te verwijderen. Dit kan worden opgenomen als INSERT INTO medewerkers phone_number values(TO_NUMBER(‘0419 853 694’);

Other episodes