我们在写PL/SQL语句时,经常会用到字符串A与数字B的比较,而很多人的做法是直接做比较,殊不知Oracle会隐含地先将字符串A转换为数字,然后再与数字B做比较,这样做之后,就出现隐患了,即当时写程式时,无论怎么测试都不会出现错误,一旦运行一段时间后,系统使用者就会反映“Form程式出现异常或者是Report出现异常”,而异常就是“ORA-01722: 无效数字或者ORA-01722: invalid number”,而开发者在查找原因时,却会感觉莫名其妙,觉得不可能。
其实,原因很简单,就是在写PL/SQL时,书写不规范造成的,即尽量少使用隐含转换。
排除错误方法:可以先从Where语句中查找,检查是否存在数据类型隐含转换的情况,然后在Select语句中,检查是否存在数据类型隐含转换的情况,还要检查所使用的函数如Nvl、Decode等,检查这些函数中所引用的栏位,是否存在数据类型隐含转换的情况。
例子如下:
-- Create table
create table Test
(
ORDER_Num VARCHAR2(8)
);
insert into Test(Order_Num) Values('123456');
insert into Test(Order_Num) Values('123457');
insert into Test(Order_Num) Values('12345-1');
insert into Test(Order_Num) Values('12345-2');
出错的语句:
Select t.Order_Num, Decode(t.Order_Num, 123456, 'a', 'b') From Test t
where t.order_num < 223456;
改正为:
Select t.Order_Num, Decode(t.Order_Num, '123456', 'a', 'b') From Test t
where t.order_num < '223456';
分享到:
相关推荐
INVALID_NUMBER (ORA-01722) **异常描述:** 当尝试将非数字字符串转换为数值类型时触发此异常。 **解决方法:** - 在转换之前验证输入数据是否为有效的数字格式。 - 使用适当的错误处理逻辑来捕获并处理此类异常...
7. **INVALID_NUMBER (ORA-01722)** - 描述:字符到数字的转换失败。 - 举例:尝试将非数字字符串转换为数值类型。 8. **LOGIN_DENIED (ORA-01017)** - 描述:使用无效的用户名或密码登录Oracle。 - 举例:当...
#### ORA-00036: Inconsistent SQL (or PL/SQL) state - **解释**: SQL或PL/SQL状态不一致。 - **解决方案**: 检查SQL语句或PL/SQL块中的逻辑错误。 #### ORA-00037: Unable to switch between different ...
#### ORA-00034: Unable to open current PL/SQL undo tablespace - **描述**:无法打开当前的PL/SQL撤销表空间。 - **解决方法**:确认撤销表空间的路径和权限设置。 #### ORA-00035: LICENSE_MAX_USERS less than...
以上列出的Oracle异常是开发和维护Oracle数据库应用程序时常见的问题。了解这些异常的原因和解决方案有助于提高数据库应用的稳定性和效率。对于每一种异常,都应该采取相应的预防措施和处理策略,确保应用程序能够...
7. `Invalid_number` (ora-01722):尝试将非法字符串转换为数字。 8. `No_data_found` (ora-01403):SELECT INTO 未返回任何行,或引用了未初始化的索引表元素。 9. `Too_many_rows` (ora-01422):SELECT INTO 语句...
9. **INVALID_NUMBER** (ORA-01722): 当尝试将非数字字符串转换为数字时,如果转换失败,Oracle会抛出此异常。在处理数据时,需要验证输入的格式是否正确。 10. **LOGGIN_DENIED** (ORA-01017): 提供的用户名和密码...
在编写PL/SQL块时,开发者应充分考虑到这些预定义异常的可能触发场景,并通过EXCEPTION处理块来妥善管理这些异常,以增强程序的健壮性和用户友好度。例如,在处理数据库查询时,可以捕获NO_DATA_FOUND和TOO_MANY_...
- `INVALID_NUMBER`(ora-01722):尝试将非数字字符串转换为数字时抛出。 - `ZERO_DIVIDE`(ora-01476):执行除法运算时,若除数为0则抛出。 - `ACCESS_INFO_NULL`(ora-06530):访问未初始化的对象时抛出。 - `...
7. **INVALID_NUMBER (ORA-01722)** - **描述**:当尝试将无法解析为数字的字符串转换为数字类型时触发。 - **示例场景**:例如,在输入非数字字符作为数字类型的参数时,就会触发此异常。 8. **NO_DATA_FOUND ...
- `ORA-1722 Invalid-NUMBER`:转换一个数字失败。 - `ORA-6500 Storage-error`:内存不够引发的内部错误。 - `ORA-6501 Program-error`:内部错误。 - `ORA-6502 Value-error`:转换或截断错误。 - `ORA-6504 ...
当尝试将非数字字符串转换为数字类型时,系统会抛出`INVALID_NUMBER`(ORA-01722)异常。 **解决方法:** 1. **验证输入**:确保所有用于数值计算的输入都是有效的数字格式。 2. **使用TRY/CATCH结构**:通过TRY/...
- **INVALID_NUMBER** (ORA-1722) - 对非数字值进行数字运算。 - **LOGIN_DENIED** (ORA-1017) - 无效的用户名或密码。 - **NO_DATA_FOUND** (ORA-1403) - 查询未找到数据。 - **NOT_LOGGED_ON** (ORA-1012) - 尚未...
它提供了一种简单的方式来进行 SQL 查询、执行 PL/SQL 脚本以及管理数据库环境。本文档将详细介绍 SQLPlus 中的一些常用命令及其用途。 #### 二、显示系统信息 - **命令**: `show all` - **作用**:此命令用于...
当在PL/SQL块中使用`SELECT INTO`将查询结果赋值给变量时,如果查询返回零行,就会抛出此异常。例如,给定的代码段中,查询`CB_LOGON_CTRL`表的`LCL_LASTFAIL`和`LCL_FAILTODAY`字段并尝试将它们分别赋值给`V_...
- **INVALID_NUMBER**:尝试将非数字字符串转换为数字。 - **ZERO_DIVIDE**:除数为零的算术操作。 - **VALUE_ERROR**:值不符合预期格式或范围。 预定义异常不需要显式声明,当它们被触发时,Oracle 会自动抛出...
除了以上提到的,还有诸如ZERO_DIVIDE(除数为零)、INVALID_NUMBER(无效数字格式)等预定义异常,它们都需要根据实际情况进行适当的处理。在编写PL/SQL代码时,理解并合理利用异常处理能显著提高代码的健壮性,...
其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),Oracle技术能够帮助提高就业的深度。 其三、职业方向多:Oracle数据库管理方向、Oracle开发及系统架构方向、Oracle数据建模数据仓库等...