SQL error “ORA-01722: invalid number”

前端 未结 13 1655
野趣味
野趣味 2020-11-29 10:15

A very easy one for someone, The following insert is giving me the

ORA-01722: invalid number

why?

INSERT INTO C         


        
相关标签:
13条回答
  • 2020-11-29 10:35

    In my case the conversion error was in functional based index, that I had created for the table.

    The data being inserted was OK. It took me a while to figure out that the actual error came from the buggy index.

    Would be nice, if Oracle could have gave more precise error message in this case.

    0 讨论(0)
  • 2020-11-29 10:36

    Oracle does automatic String2number conversion, for String column values! However, for the textual comparisons in SQL, the input must be delimited as a String explicitly: The opposite conversion number2String is not performed automatically, not on the SQL-query level.

    I had this query:

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

    That one presented a problem: Error: ORA-01722: invalid number

    I have just surrounded the "numerical" values, to make them 'Strings', just making them explicitly delimited:

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

    ...and voilà: It returns the expected result.

    edit: And indeed: the col acc_num in my table is defined as String. Although not numerical, the invalid number was reported. And the explicit delimiting of the string-numbers resolved the problem.

    On the other hand, Oracle can treat Strings as numbers. So the numerical operations/functions can be applied on the Strings, and these queries work:

    select max(string_column) from TABLE;

    select string_column from TABLE where string_column between '2' and 'z';

    select string_column from TABLE where string_column > '1';

    select string_column from TABLE where string_column <= 'b';

    0 讨论(0)
  • 2020-11-29 10:37

    If you do an insert into...select * from...statement, it's easy to get the 'Invalid Number' error as well.

    Let's say you have a table called FUND_ACCOUNT that has two columns:

    AID_YEAR  char(4)
    OFFICE_ID char(5)
    

    And let's say that you want to modify the OFFICE_ID to be numeric, but that there are existing rows in the table, and even worse, some of those rows have an OFFICE_ID value of ' ' (blank). In Oracle, you can't modify the datatype of a column if the table has data, and it requires a little trickery to convert a ' ' to a 0. So here's how to do it:

    1. Create a duplicate table: CREATE TABLE FUND_ACCOUNT2 AS SELECT * FROM FUND_ACCOUNT;
    2. Delete all the rows from the original table: DELETE FROM FUND_ACCOUNT;
    3. Once there's no data in the original table, alter the data type of its OFFICE_ID column: ALTER TABLE FUND_ACCOUNT MODIFY (OFFICE_ID number);

    4. But then here's the tricky part. Because some rows contain blank OFFICE_ID values, if you do a simple INSERT INTO FUND_ACCOUNT SELECT * FROM FUND_ACCOUNT2, you'll get the "ORA-01722 Invalid Number" error. In order to convert the ' ' (blank) OFFICE_IDs into 0's, your insert statement will have to look like this:

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

    0 讨论(0)
  • 2020-11-29 10:42

    An ORA-01722 error occurs when an attempt is made to convert a character string into a number, and the string cannot be converted into a number.

    Without seeing your table definition, it looks like you're trying to convert the numeric sequence at the end of your values list to a number, and the spaces that delimit it are throwing this error. But based on the information you've given us, it could be happening on any field (other than the first one).

    0 讨论(0)
  • 2020-11-29 10:43

    You can always use TO_NUMBER() function in order to remove this error.This can be included as INSERT INTO employees phone_number values(TO_NUMBER('0419 853 694');

    0 讨论(0)
  • 2020-11-29 10:44

    Suppose telephone number is defined as NUMBER then the blanks cannot be converted into a number:

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

    The above gives you a

    ORA-01722: invalid number

    0 讨论(0)
提交回复
热议问题