`
957803796_1
  • 浏览: 123694 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Oracle-ORA-01722 invalid number错误

 
阅读更多

本来正常的,经过抓包才知道原来是数字型的无意中多了乱码!

本来是3276的居然多了后面一串3276PuAnrSeU2zliU+IV/FHlnX2Xgia1au2xX2vMWtw

http://www.cnblogs.com/raymond19840709/archive/2008/05/16/1200826.html

1. 代码里面执行了如下SQL语句:

select mdn from tablename where mdn=13800000000

tablename表里面的mdn字段是varchar2()类型字段,由于Oracle的字段类型隐式转换功能

上面的SQL语句通常是可行的,查询的时候oracle解析该条件时,会首先to_number(mdn)

再和where mdn=13812345678进行比较判断,如果能够确保mdn字段里面存放的全为数字

那么这个语句是一直不会报错的(可能存在效率问题),但偏偏有人误操作在mdn里面加入了

几个字母133aa000000,如果还是上面的语句,并且表里面没有13800000000这个用户的数据,

当查询扫描到133aa000000时to_number(mdn)报错ORA-01722 invalid number

2. 因此写SQL语句的时候最好还是规规矩矩的写:

select mdn from tablename where mdn='13800000000'

ORA-01722 invalid number很容易理解,无须多言,一般发生在显式的to_number()类型转换的参数错误时。

前几天我也遇到了一个由于直觉作怪而差点被忽略了的ORA-01722错误。


http://davidyu720.itpub.net/post/31716/291191http://davidyu720.itpub.net/post/31716/291191

一个查询 select to_number(c.name) as srvtype, value as typename from sys_code c where c.srvclass=9 --srvclass为字符型
一直工作得很好,但突然一天返回错误ORA-01722 invalid number。由于条件srvclass字段是varchar2类型,就想当然地以为是ORACLE的bug(恰巧上周刚确认了ORACLE的一个查询bug),将条件改写成c.srvclass='9'后,查询就又能运行了。

事情虽然过去了,可总觉得有点不对劲。首先ORACLE不可能出现这么简单的BUG;其次就算是BUG,返回的错误提示也不应该是 invalid number。按理说,即使ORACLE不能自动完成类型转换而要求写成 srvclass='9',那么对srvclass=9这种写法的错误提示也应该是invalid character。但由于直觉作怪,也就没有深究


正好有人质疑bug的说法,我就从头进行检查,才发现错误的根本原因是:ORACLE将where c.srvclass=9解释为where to_number(c.srvclass)=9
1)以前执行SQL时,ORACLE进行全表扫描,对每行的srvclass都转换为number型进行比较.以前表中的srvclass的取值只有字符0到9,所以没有出错;
2)后来表中加入了新数据,srvclass的取值都是字母串,ORACLE进行全表扫描时,对新行上srvclass的to_number转换当然就返回ORA-01722 invalid number了。

附:我也拜读了yangtingkun的关于ORA-01722错误的帖子http://yangtingkun.itpub.net/post/468/237197,介绍了一种错误情形:将函数调用放到SELECT列表中可以执行,如果放到WHERE条件中就会报错。

分享到:
评论
1 楼 myyugioh 2013-01-14  
今天我碰到了一个更怪的情况,两个库都有张一样的表,表有个字段id是varchar2类型的,但是里面的值是纯数字。在A库查id in (01,02,03)没有问题,在B库查id in (01,02,03)就报ora-01722了,换成id in ('01','02','03')就正常了

相关推荐

    oracle+ora-各种常见java.sq

    在Oracle数据库操作中,我们...当遇到具体异常时,结合Oracle的错误代码(如ORA-XXX)查找官方文档或在线资源,通常能找到具体的解决方案。在编程时,采用异常处理机制,捕获并处理这些错误,能有效提高程序的健壮性。

    ORACLE 异常错误处理

    - `ORA-1722 Invalid-NUMBER`:转换一个数字失败。 - `ORA-6500 Storage-error`:内存不够引发的内部错误。 - `ORA-6501 Program-error`:内部错误。 - `ORA-6502 Value-error`:转换或截断错误。 - `ORA-6504 ...

    oracle错误代码大全

    ### Oracle 错误代码解析 #### ORA-00001: Unique constraint violated - **解释**: 当尝试插入或更新的数据违反了唯一性约束时触发此错误。 - **解决方案**: 检查数据是否重复,并确保每个字段值都是唯一的。 ##...

    oracle变更数据表字段类型

    1. **ORA-22858: invalid alteration of datatype** - 这个错误通常发生在尝试直接改变字段类型时,特别是在从固定长度的类型(如`VARCHAR2`)转换到变长类型(如`CLOB`)时。 - 解决方案是先创建一个新的字段,...

    oracle 10g错误代码手册

    - **ORA-01722: invalid number** - **含义**:输入的数值格式不正确。 - **解决方法**:检查并修正输入的数值。 #### 六、文档使用须知 - **版权信息**:文档受版权保护,不得非法复制或传播。 - **保密条款**...

    Oracle常用异常代码

    INVALID_NUMBER (ORA-01722) **异常描述:** 当尝试将非数字字符串转换为数值类型时触发此异常。 **解决方法:** - 在转换之前验证输入数据是否为有效的数字格式。 - 使用适当的错误处理逻辑来捕获并处理此类异常...

    oracle 错误一览表

    ### Oracle 错误一览表详解 #### ORA-00001: Unique constraint violated - **描述**:当尝试插入或更新一个行时,违反了唯一性约束。 - **解决方法**:确保数据不违反任何唯一性约束,或者修改约束以适应数据。 #...

    Oracle_Errors描述

    6. **ORA-01722: invalid number** 当试图将非数字字符串转换为数字,或者数字格式不正确时,会触发此错误。确保数据类型匹配或输入数据的格式正确即可避免。 7. **ORA-00911: invalid character** 在SQL语句中发现...

    Oracle错误一览表

    ### Oracle错误代码详解 在处理Oracle数据库时,遇到错误是在所难免的,了解并掌握常见的错误代码及其含义,对于快速定位问题、解决问题至关重要。本文将详细介绍部分Oracle错误代码的含义及可能的原因,帮助数据库...

    oracle异常总结

    - `INVALID_NUMBER`(ora-01722):尝试将非数字字符串转换为数字时抛出。 - `ZERO_DIVIDE`(ora-01476):执行除法运算时,若除数为0则抛出。 - `ACCESS_INFO_NULL`(ora-06530):访问未初始化的对象时抛出。 - `...

    Oracle Exception汇总(自定义Oracle异常)

    9. **INVALID_NUMBER** (ORA-01722): 当尝试将非数字字符串转换为数字时,如果转换失败,Oracle会抛出此异常。在处理数据时,需要验证输入的格式是否正确。 10. **LOGGIN_DENIED** (ORA-01017): 提供的用户名和密码...

    Oracle常见错误:ORA

    类似地,其他常见的Oracle异常如`DUP_VAL_ON_INDEX`、`INVALID_CURSOR`、`INVALID_NUMBER`、`TOO_MANY_ROWS`和`ZERO_DIVIDE`也可以通过这种方式进行处理。 总的来说,理解Oracle的错误代码和异常处理机制是成功管理...

    oracle异常处理

    7. `Invalid_number` (ora-01722):尝试将非法字符串转换为数字。 8. `No_data_found` (ora-01403):SELECT INTO 未返回任何行,或引用了未初始化的索引表元素。 9. `Too_many_rows` (ora-01422):SELECT INTO 语句...

    oracle常见Exception

    当尝试将非数字字符串转换为数字类型时,系统会抛出`INVALID_NUMBER`(ORA-01722)异常。 **解决方法:** 1. **验证输入**:确保所有用于数值计算的输入都是有效的数字格式。 2. **使用TRY/CATCH结构**:通过TRY/...

    oracle常见错误代码的分析与解决

    其次,"ORA-01422"错误表示"EXACT FETCH RETURNS MORE THAN REQUESTED NUMBER OF ROWS",即精确提取返回的行数超过了请求的数量。这通常发生在使用SELECT INTO语句时,尝试将多行结果放入单个变量中。解决方法是改用...

    oracle异常(最全异常收集)

    #### ORA-1722:INVALID_NUMBER - **异常说明**:无效数字。 - **常见原因**: - 将非数字字符转换为数字类型时失败。 - 输入的数据格式不正确。 - **解决方案**: - 确保输入的数据是有效的数字格式。 - 使用...

    SQLException

    7. **ORA-01722: invalid number** - **含义**:在SQL语句中,字符串转换为数字失败,因为该字符串不是有效的数字格式。 - **解决方法**:确保所有的数值输入都是正确的格式。 8. **ORA-06530: ACCESS_INTO_NULL...

    Oracle 常用预定义异常

    7. **INVALID_NUMBER (ORA-01722)** - **描述**:当尝试将无法解析为数字的字符串转换为数字类型时触发。 - **示例场景**:例如,在输入非数字字符作为数字类型的参数时,就会触发此异常。 8. **NO_DATA_FOUND ...

    SQL LOADER错误小结

    ORA-01722: invalid number ``` 在这种情况下,可以尝试修改控制文件,避免将换行符视为数值的一部分。 3. **日期格式问题**: 当数据文件中的日期字段需要特殊格式处理时,可以使用`TO_DATE`函数来转换。确保...

    Oracle21个预定义异常

    - **错误代码**:ORA-01722 - **场景示例**:在执行涉及数字计算的查询时,若某字段值非数字格式,将导致此异常。 #### 8. LOGINDENIED - **异常描述**:提供的登录凭证(用户名或密码)不正确时触发。 - **错误...

Global site tag (gtag.js) - Google Analytics