我们有一个表EVAPP_INTERFACE
,它没有在许多数字列上指定比例或精度。我们需要修改列定义以添加适当的比例和精度,但我们无法更改表中列的顺序。为了实现这一点,我们正在执行以下操作
- 我们将所有数据复制到一个新表中
EVI
EVAPP_INTERFACE
我们将现有表中的数字列设置为NULL
- 我们改变
EVAPP_INTERFACE
列的精度 - 我们将数据复制回来
然而,当数据被复制回来时,一些行会产生异常,因为它们超出了新的比例和/或精度设置(即,应该存储利率的列中的值 10 亿)。
ERROR : ORA-01438: value larger than specified precision allowed for this column
我想确定哪一列和哪一行有这个坏数据。
首先是重复表
select count(*) into countTab from USER_TAB_COLUMNS where TABLE_NAME = 'EVI';
IF (countTab <> 0) then
execute immediate 'drop table EVI';
execute immediate 'create table EVI as (select * from EVAPP_INTERFACE)';
ELSE
execute immediate 'create table EVI as (select * from EVAPP_INTERFACE)';
END IF;
execute immediate 'TRUNCATE TABLE EVAPP_INTERFACE';
然后,我改变精度:整个脚本中有 226 个这样的块。
select count(*) into countCol from USER_TAB_COLUMNS where TABLE_NAME = 'EVAPP_INTERFACE' and COLUMN_NAME = 'PST_NUM' and DATA_SCALE is null;
IF (countCol <> 0) then
execute immediate 'alter table EVAPP_INTERFACE modify PST_NUM NUMBER(14,2)' ;
DBMS_OUTPUT.put_line(' EVAPP_INTERFACE.PST_NUM has been modified to the required precision');
END IF;
然后,我插入旧数据。这是它爆炸的地方
execute immediate 'INSERT INTO EVAPP_INTERFACE SELECT * from EVI';
所以,我不完全确定 SQLERRM 和 SQLCODE 是否会给出完整的堆栈跟踪。而且,我没有足够的数据集来验证这一点。谁能确认我是否可以找出导致问题的特定列?我已经提供了 NUMBER(14,2) 作为大多数列的精度,如果可能的话,我想删除坏数据而不是提高精度。而且由于是生产数据,我不允许导入数据进行检查。