在oracle DB中,我有一个表TABLE1,其列数据类型定义为VARCHAR2(50)。我有另一个表TABLE2,列数据类型定义为NUMBER。 TABLE1中存在的行数约为23k,它们似乎都是数字。但是当我尝试插入命令时,我得到以下错误。
Error report -
SQL Error: ORA-01722: invalid number
01722. 00000 - "invalid number"
*Cause:
*Action:
这显然意味着很少有行不是数字。但我无法确定那些没有数字案例的人。如何识别非数字行。
P.S: Oracle数据库版本:9.2.0.8.0
是的,我知道它的古老。
答案 0 :(得分:0)
为什么要在字符串中存储数字?这是根本问题。
您可以使用where
子句来避免行:
insert into table2( . . .)
select . . .
from table1 t1
where regexp_like(numbercol, '^[0-9]+$')
这假定“数字”表示“非负整数”。显然,该模式可以推广到其他范围和/或数字格式。
您可以通过运行类似的select
:
select . . .
from table1 t1
where not regexp_like(numbercol, '^[0-9]+$')
答案 1 :(得分:0)
以下是用于识别差异情况的PL SQL块。我案例中的特殊字符是双引号。几乎没有问题,因此打印输出是可行的。如果有更多的差异情况,那么在表格列中捕获错误消息将会有所帮助。
declare
cursor cur is
select * from TABLE1 ; ----- cursor to loop through cases individually
begin
for rec in cur
loop
begin
insert into table2 (column1)
select to_number(column1)
from table1
where
column1=rec.column1 ;
exception when others
then
Dbms_Output.Put_Line('error for '||rec.column1||' '||substr(sqlerrm,0,150)); --- error msg with discrepancy case
end;
end loop;
end;
/