ORACLE之ora-01722和ORA-01403的错误测试

本文探讨了在Oracle数据库中使用SQL进行数据更新时遇到的ORA-01722无效数字错误,分析了错误原因,即在更新操作中尝试将非数字字符串转换为数字类型,导致数据类型不匹配。通过具体示例,展示了如何避免此类错误,包括在表字段中存储不同类型数据时可能引发的问题。

 select to_number('3434,3333.000') from dual;
/
select 'abc' - 124 from dual;
/
select '01-JUN-01' - 'abc' from dual;
/

 

测试:config:
  表一
create table mms_err(id number(6),
  section varchar2(5)
);
/
 insert into mms_err
 values(1,1);
 /
 insert into mms_err
 values(2,2);
 /
 insert into mms_err
 values(3,'C');
 /
insert into mms_err
 values(4,'D');
 /
 insert into mms_err
 values(5,'E');
 /
 insert into mms_err
 values(6,'F');
 /
test:
update mms_err
set id=1
where section=1

报错:ORA-01722: invalid number

 

表二
CREATE TABLE MMS_SECTION
(SEQNUM NUMBER(4) 
)
/
INSERT INTO MMS_SECTION
values(1);
/
INSERT INTO MMS_SECTION
values(2);
/
INSERT INTO MMS_SECTION
values(3);
/
INSERT INTO MMS_SECTION
values(4);

test--------
UPDATE MMS_ERR
SET SECTION=NVL((
SELECT SEQNUM
FROM MMS_SECTION
WHERE SEQNUM=SECTION),0)
WHERE ID IN(1,2,6);
/
UPDATE MMS_ERR
SET SECTION=NVL((
SELECT SEQNUM
FROM MMS_SECTION
WHERE SECTION=SEQNUM),0)
WHERE ID IN(1,2,6);
均报错;
ORA-01722: invalid number
如果section中全部都存数字,那肯定是OK的;但是where 后面在对比的时候,是把section转换成number型的 再比较的 故而出错;

参考:

asktom:
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:11504677087008
http://space.itpub.net/35489/viewspace-85148
实例:
http://www.cnblogs.com/raymond19840709/archive/2008/05/16/1200826.html
http://jerrygao.javaeye.com/blog/168349

-------------------------ora-01403-------------------------------------------

select into,select不到数据就会报错 其中一种可能而已。

 


 

 

转载于:https://www.cnblogs.com/gracejiang/archive/2010/06/13/5890478.html

### ORA-01722 错误原因及解决方法 Oracle 数据库错误 `ORA-01722: invalid number` 表示数据库在尝试将一个非数字值转换为数字类型时失败。这种错误通常发生在 SQL 查询中涉及隐式类型转换的场景,尤其是在 `WHERE` 子句或函数中对字段进行操作时。例如,当一个字符串列被用于与数字进行比较,或者在某些函数中期望接收数字参数但传入了非数字字符串,Oracle 会尝试自动将字符串转换为数字,如果转换失败,则会抛出此错误[^3]。 #### 常见原因 1. **隐式类型转换**:在 SQL 查询中,当对一个 `VARCHAR2` 类型的列进行数值比较时,Oracle 会尝试将其转换为 `NUMBER` 类型。如果列中包含非数字字符(如字母、空格或特殊符号),则转换失败并引发 `ORA-01722` 错误。 ```sql SELECT * FROM employees WHERE salary = '100A'; ``` 2. **函数参数类型不匹配**:某些 Oracle 函数要求输入参数为数字类型,若传入字符串或表达式结果为非数字值,会导致隐式转换失败。 ```sql SELECT * FROM table WHERE TO_NUMBER(name) > 100; ``` 3. **连接字符串中的数字字段**:在某些复杂的 SQL 查询中,如子查询或连接操作中,若某个字段本应为数字但实际存储了非数字值,也可能导致此错误。 ```sql SELECT * FROM (SELECT LPAD(fund_account, 19, 0) || LPAD(exchange_type, 4, '0') AS position_str FROM ...) WHERE position_str > '@position_str'; ``` #### 解决方法 1. **显式类型转换**:在进行数值比较或操作前,使用 `TO_NUMBER` 函数显式转换字符串列,并结合 `CASE` 或 `DECODE` 函数处理可能的非数字值。 ```sql SELECT * FROM employees WHERE TO_NUMBER(salary_str) > 10000; ``` 若不确定字段是否包含非数字内容,可以使用 `REGEXP_LIKE` 过滤非法数据: ```sql SELECT * FROM employees WHERE REGEXP_LIKE(salary_str, '^[0-9]+(\.[0-9]+)?$'); ``` 2. **验证数据完整性**:检查涉及数值转换的字段,确保其内容为有效数字格式。可以使用约束或触发器来防止非法数据插入。 3. **重构查询逻辑**:避免在 `WHERE` 子句中对字段进行不必要的转换操作。例如,在连接操作中使用原始字段进行比较,而非构造出的字符串。 ```sql SELECT * FROM uftfundaccountsysno a RIGHT JOIN uftaccountdeploy b ON a.fund_account = b.fund_account WHERE b.enable_status = 1; ``` 4. **调试复杂查询**:在使用嵌套子查询或字符串拼接生成数字字段时,应逐步执行并检查中间结果,确保每一步输出均为合法数字格式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值