Oracle:SQL错误:ORA-01722:将NUMBER复制到VARCHAR2时的编号无效

时间:2016-05-31 16:09:34

标签: oracle sqldatatypes

我有一个Oracle数据库,我需要将NUMBER(38,0)列更改为其中一个表中的VARCHAR2列。根据{{​​3}}的建议,我正在执行以下操作:

  1. 添加VARCHAR2
  2. 类型的临时列
  3. 将数据从原始NUMBER列复制到临时列
  4. 删除原始NUMBER列
  5. 将临时列重命名为原始列名称
  6. 但是,即使副本是从 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)  
    

    我在一个用假数字创建的小测试表上运行了相同的脚本,并且运行成功。也许这表明这是一个数据问题?无论如何,我不知道如何解决他的问题。任何建议将不胜感激。

1 个答案:

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