将varchar转换为数字时出错(但没有数字)

时间:2018-01-03 20:48:46

标签: oracle varchar2 numeric-conversion

我有一个包含多个列的表,如下所示:

CREATE TABLE CRM.INFO_ADICIONAL
(
  ID_INFO_ADICIONAL        NUMBER(10)           NOT NULL,
  NOMBRE                   VARCHAR2(100 BYTE)   NOT NULL,
  OBLIGATORIO              NUMBER(1)            NOT NULL,
  TIPO_DATO                VARCHAR2(2 BYTE)     NOT NULL,
  ACTIVO                   NUMBER(1)            NOT NULL,
  ID_TIPO_REQUERIMIENTO    NUMBER(10)           NOT NULL,
  ID_USUARIO_AUDIT         NUMBER(10)           NOT NULL,
  ORDEN                    NUMBER(3)            DEFAULT 1,
  RECHAZO_POR_NO           NUMBER(1),
  ID_TIPO_ARCHIVO_ADJUNTO  NUMBER(10),
  SOLICITAR_EN             VARCHAR2(30 BYTE),
  ID_CONSULTA              NUMBER(10),
  COMBO_ID                 VARCHAR2(40 BYTE),
  APLICAR_COMO_VENC        NUMBER(1),
  MODIFICABLE              NUMBER(1)            DEFAULT 0,
  ID_AREA_GESTION          NUMBER(10),
  ID_TAREA                 NUMBER(10)
)

“COMBO_ID”列是目标。它定义为VARCHAR,但是当我尝试插入行时,TOAD显示

  

“ORA-06502:PL / SQL:错误:错误转换decartácteranúmero   numéricoode valor“

或“数字转换错误”,英文。

这个表有一些预先存在的数据,我甚至发现了一些行,包括COMBO_ID列的值,所有这些行都是VARCHAR,即:

  

NACION(国家),SEXO(性别)等

我尝试了一些简单的SELECT语句

SELECT
    ID_INFO_ADICIONAL,
    NOMBRE,
    OBLIGATORIO,
    TIPO_DATO,
    ACTIVO,
    ID_TIPO_REQUERIMIENTO,
    ID_USUARIO_AUDIT,
    ORDEN,
    RECHAZO_POR_NO,
    ID_TIPO_ARCHIVO_ADJUNTO,
    SOLICITAR_EN,
    COMBO_ID,
    APLICAR_COMO_VENC,
    ID_CONSULTA,
    MODIFICABLE,
    ID_AREA_GESTION,
    ID_TAREA
INTO
    pRegistro
FROM
    crm.info_adicional

其中 pRegistro 被声明为

  

pRegistro INFO_ADICIONAL%ROWTYPE;

同样,我仍然遇到这个'数字转换错误'。 但是,等等,如果我使用NUMBER:

对COMBO_ID列中的SELECT值进行硬编码
SELECT
    --other columns
    123456 COMBO_ID,
    --other columns
INTO
    pRegistro
FROM
    crm.info_adicional

它的工作原理是什么,它被定义为VARCHAR。 如果我这样做但是会对字符串进行编码,则无法再次执行

我的DEV环境已经尝试过了,它运行正常。

我不是甲骨文的专家,但我感到非常迷茫。 表格是否会“混淆”? 有线索吗?

2 个答案:

答案 0 :(得分:0)

如果您尝试推送长度超过VARCHAR2容量的字符串(在您的情况下为40),也会引发该错误。

尝试检查您尝试插入的所有数据是否正确:

SELECT
    COMBO_ID
FROM
    crm.info_adicional
ORDER BY length(COMBO_ID) desc;

这也可以解释为什么它在您的DEV环境中正常工作,我认为它具有不同的数据。

答案 1 :(得分:0)

好的,我已经找到了答案。

引用Oracle文档:

  

%ROWTYPE属性提供表示表或视图中的行的记录类型。 一行中的列和记录中的相应字段具有相同的名称和数据类型。

因此,基本上,SELECT语句需要与表列定义的顺序相同。

在我的情况下,我有一些不同的列(包括COMBO_ID)。 尝试,重新订购,并像一个魅力。

谢谢大家的支持。