将列数据类型为varchar2的表数据插入到具有列数据类型为数字的表中

时间:2017-06-01 14:02:18

标签: sql oracle oracle9i

在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

是的,我知道它的古老。

2 个答案:

答案 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;
/