首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查哪个值导致SQL错误: ORA-01722:无效编号

如何检查哪个值导致SQL错误: ORA-01722:无效编号
EN

Stack Overflow用户
提问于 2016-12-29 04:58:57
回答 2查看 11K关注 0票数 2

获取SQL错误:

ORA-01722:插入SQL中的无效编号。

如何检查哪一行或哪个值导致此错误,因为它没有给出确切的行号。SQL有200多个值。下面的消息给出133是SQL的起始行号。

错误从行开始: 133在命令-插入到TABLE1……。。 SQL错误: ORA-01722:无效编号

EN

回答 2

Stack Overflow用户

发布于 2016-12-29 07:19:10

在下面的示例中,您可以看到如何为错误"ORA-01722:无效数字“和行号找到一个有问题的值。

这里我使用了一个数字数据类型变量,您还可以使用to_number()函数来检测有问题的值。此外,为了获得错误的行号,我建议将“DBMS_UTILITY.FORMAT_ERROR_BACKTRACE()”放在异常部分。

代码语言:javascript
复制
create table customer (id varchar2(10));
insert into customer values (1);
insert into customer values (2);

select to_number(id) from customer; 

insert into customer values ('3'); -- oracle implicitly convert it to number datatype

select to_number(id) from customer; -- no error

insert into customer values ('a'); -- inserting a character

select to_number(id) from customer; -- throws error, ORA-01722: invalid number

现在,查找导致此错误的值:

代码语言:javascript
复制
DECLARE
  v_char_err customer.id%type;
  v_to_num NUMBER;
BEGIN
  FOR i IN
  (SELECT id FROM customer
  )
  LOOP
    v_char_err:=i.id;
    v_to_num  :=i.id;    
  END LOOP;
EXCEPTION
WHEN OTHERS THEN
  dbms_output.put_line (v_char_err);                                           -- will print problematic value
  dbms_output.put_line (SUBSTR(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(),1,4000)); -- will give line number
END;
/
票数 1
EN

Stack Overflow用户

发布于 2016-12-29 09:24:19

用于第一个案例

代码语言:javascript
复制
insert into customer values ('a');

select to_number(id) from customer;

您正在尝试从一个列中转换数字,在该列中添加了非数字字符('a'),如果只插入了数字字符,则该列实际上会抛出错误无效的数字。

在第二例中

代码语言:javascript
复制
v_char_err:=i.id;

v_to_num  :=i.id; 

您再次尝试将包含非数字值的表列中的varchar类型分配给数值变量。

只需从列中删除任何非数字字符,然后测试它。不会抛出错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41373379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档