本来正常的,经过抓包才知道原来是数字型的无意中多了乱码!
本来是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条件中就会报错。
分享到:
相关推荐
在Oracle数据库操作中,我们...当遇到具体异常时,结合Oracle的错误代码(如ORA-XXX)查找官方文档或在线资源,通常能找到具体的解决方案。在编程时,采用异常处理机制,捕获并处理这些错误,能有效提高程序的健壮性。
- `ORA-1722 Invalid-NUMBER`:转换一个数字失败。 - `ORA-6500 Storage-error`:内存不够引发的内部错误。 - `ORA-6501 Program-error`:内部错误。 - `ORA-6502 Value-error`:转换或截断错误。 - `ORA-6504 ...
### Oracle 错误代码解析 #### ORA-00001: Unique constraint violated - **解释**: 当尝试插入或更新的数据违反了唯一性约束时触发此错误。 - **解决方案**: 检查数据是否重复,并确保每个字段值都是唯一的。 ##...
1. **ORA-22858: invalid alteration of datatype** - 这个错误通常发生在尝试直接改变字段类型时,特别是在从固定长度的类型(如`VARCHAR2`)转换到变长类型(如`CLOB`)时。 - 解决方案是先创建一个新的字段,...
- **ORA-01722: invalid number** - **含义**:输入的数值格式不正确。 - **解决方法**:检查并修正输入的数值。 #### 六、文档使用须知 - **版权信息**:文档受版权保护,不得非法复制或传播。 - **保密条款**...
INVALID_NUMBER (ORA-01722) **异常描述:** 当尝试将非数字字符串转换为数值类型时触发此异常。 **解决方法:** - 在转换之前验证输入数据是否为有效的数字格式。 - 使用适当的错误处理逻辑来捕获并处理此类异常...
### Oracle 错误一览表详解 #### ORA-00001: Unique constraint violated - **描述**:当尝试插入或更新一个行时,违反了唯一性约束。 - **解决方法**:确保数据不违反任何唯一性约束,或者修改约束以适应数据。 #...
6. **ORA-01722: invalid number** 当试图将非数字字符串转换为数字,或者数字格式不正确时,会触发此错误。确保数据类型匹配或输入数据的格式正确即可避免。 7. **ORA-00911: invalid character** 在SQL语句中发现...
### Oracle错误代码详解 在处理Oracle数据库时,遇到错误是在所难免的,了解并掌握常见的错误代码及其含义,对于快速定位问题、解决问题至关重要。本文将详细介绍部分Oracle错误代码的含义及可能的原因,帮助数据库...
- `INVALID_NUMBER`(ora-01722):尝试将非数字字符串转换为数字时抛出。 - `ZERO_DIVIDE`(ora-01476):执行除法运算时,若除数为0则抛出。 - `ACCESS_INFO_NULL`(ora-06530):访问未初始化的对象时抛出。 - `...
9. **INVALID_NUMBER** (ORA-01722): 当尝试将非数字字符串转换为数字时,如果转换失败,Oracle会抛出此异常。在处理数据时,需要验证输入的格式是否正确。 10. **LOGGIN_DENIED** (ORA-01017): 提供的用户名和密码...
类似地,其他常见的Oracle异常如`DUP_VAL_ON_INDEX`、`INVALID_CURSOR`、`INVALID_NUMBER`、`TOO_MANY_ROWS`和`ZERO_DIVIDE`也可以通过这种方式进行处理。 总的来说,理解Oracle的错误代码和异常处理机制是成功管理...
7. `Invalid_number` (ora-01722):尝试将非法字符串转换为数字。 8. `No_data_found` (ora-01403):SELECT INTO 未返回任何行,或引用了未初始化的索引表元素。 9. `Too_many_rows` (ora-01422):SELECT INTO 语句...
当尝试将非数字字符串转换为数字类型时,系统会抛出`INVALID_NUMBER`(ORA-01722)异常。 **解决方法:** 1. **验证输入**:确保所有用于数值计算的输入都是有效的数字格式。 2. **使用TRY/CATCH结构**:通过TRY/...
其次,"ORA-01422"错误表示"EXACT FETCH RETURNS MORE THAN REQUESTED NUMBER OF ROWS",即精确提取返回的行数超过了请求的数量。这通常发生在使用SELECT INTO语句时,尝试将多行结果放入单个变量中。解决方法是改用...
#### ORA-1722:INVALID_NUMBER - **异常说明**:无效数字。 - **常见原因**: - 将非数字字符转换为数字类型时失败。 - 输入的数据格式不正确。 - **解决方案**: - 确保输入的数据是有效的数字格式。 - 使用...
7. **ORA-01722: invalid number** - **含义**:在SQL语句中,字符串转换为数字失败,因为该字符串不是有效的数字格式。 - **解决方法**:确保所有的数值输入都是正确的格式。 8. **ORA-06530: ACCESS_INTO_NULL...
7. **INVALID_NUMBER (ORA-01722)** - **描述**:当尝试将无法解析为数字的字符串转换为数字类型时触发。 - **示例场景**:例如,在输入非数字字符作为数字类型的参数时,就会触发此异常。 8. **NO_DATA_FOUND ...
ORA-01722: invalid number ``` 在这种情况下,可以尝试修改控制文件,避免将换行符视为数值的一部分。 3. **日期格式问题**: 当数据文件中的日期字段需要特殊格式处理时,可以使用`TO_DATE`函数来转换。确保...
- **错误代码**:ORA-01722 - **场景示例**:在执行涉及数字计算的查询时,若某字段值非数字格式,将导致此异常。 #### 8. LOGINDENIED - **异常描述**:提供的登录凭证(用户名或密码)不正确时触发。 - **错误...