我有一个Oracle数据库,我需要将NUMBER(38,0)列更改为其中一个表中的VARCHAR2列。根据{{3}}的建议,我正在执行以下操作:
但是,即使副本是从 NUMBER到VARCHAR2 ,步骤2也会导致主题错误。
作为一种保护措施,我在下面的代码表上运行我的代码,我将使用以下代码创建:
create table TPA_SPEC_COPY as select * from TPA_SPEC;
COMMIT WORK;
这是我的SQL代码尝试执行上述步骤:
ALTER TABLE TPA_SPEC_COPY
ADD (PA_SPEC_VALUE_NUM_TEMP VARCHAR2(40 CHAR));
UPDATE TPA_SPEC_COPY set PA_SPEC_VALUE_NUM_TEMP = TO_CHAR(PA_SPEC_VALUE_NUM); -- This is Line 4 where I get the error
ALTER TABLE TPA_SPEC_COPY DROP COLUMN PA_SPEC_VALUE_NUM_TEMP;
ALTER TABLE TPA_SPEC_COPY
RENAME COLUMN PA_SPEC_VALUE_NUM_TEMP TO PA_SPEC_VALUE_NUM;
这是我在SQL Developer中收到的错误:
Error starting at line : 4 in command -
UPDATE TPA_SPEC_COPY set PA_SPEC_VALUE_NUM_TEMP = TO_CHAR(PA_SPEC_VALUE_NUM)
Error report -
SQL Error: ORA-01722: invalid number
01722. 00000 - "invalid number"
*Cause: The specified number was invalid.
*Action: Specify a valid number.
编辑:添加表格结构(使用DESCRIBE TPA_SPEC_COPY
)
DESCRIBE TPA_SPEC_COPY
Name Null Type
------------------------ -------- ------------------
PA_ID NOT NULL NUMBER(10)
PA_VERSION_NUM NOT NULL NUMBER(10)
PA_SPEC_VERSION_NUM NOT NULL NUMBER(10)
SPEC_TYPE_CD NOT NULL CHAR(10 CHAR)
PA_SPEC_VALUE_NUM NUMBER(38)
UOM_CD CHAR(10 CHAR)
PA_SPEC_FORMULA_TXT VARCHAR2(100 CHAR)
PA_SPEC_COMMENT_TXT VARCHAR2(250 CHAR)
DISPLAY_FORMAT_NM VARCHAR2(30 CHAR)
ROW_PROG_UPDT_ID NOT NULL CHAR(12 CHAR)
ROW_STATUS_CD NOT NULL CHAR(1 CHAR)
ROW_UPDATE_TIME NOT NULL TIMESTAMP(9)
ROW_LASTUPD_USERID NOT NULL VARCHAR2(80 CHAR)
ROW_CREATE_TIME NOT NULL TIMESTAMP(9)
ROW_CREATE_USERID NOT NULL VARCHAR2(80 CHAR)
VARIABLE_ID VARCHAR2(100 CHAR)
SPEC_FORMULA_NM VARCHAR2(80 CHAR)
SPEC_FORMULA_VERSION_NUM NUMBER(10)
DR_SENSITIVITY_NUM NUMBER(38)
PA_SPEC_RISKTODR_CD CHAR(4 CHAR)
PA_SPEC_VALUE_NUM_TEMP VARCHAR2(40 CHAR)
我在一个用假数字创建的小测试表上运行了相同的脚本,并且运行成功。也许这表明这是一个数据问题?无论如何,我不知道如何解决他的问题。任何建议将不胜感激。
答案 0 :(得分:2)
我只能怀疑某种数据损坏,我建议这个plsql代码尝试找到它,在更新后添加提交有助于至少移动好的值。
我知道这不是最好的方法,它是一次使用的代码。
begin
for i in (select pa_id,PA_SPEC_VALUE_NUM from TPA_SPEC_COPY)
loop
begin
update TPA_SPEC_COPY set PA_SPEC_VALUE_NUM_TEMP=to_char(PA_SPEC_VALUE_NUM)
where pa_id=i.pa_id;
exception when others
then
dbms_output.put_line('Problem with ' || i.pa_id);
end;
end loop;
end;