将 varchar 转换为数字时出错(但没有数字)
Error converting varchar to numeric (but there's no number)
我有一个包含多个列的 table,如下所示:
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: error : error de conversión de carácter a número
numérico o de valor"
或者 'numeric conversion error',英文。
这个 table 有一些预先存在的数据,我什至发现一些行包括 COMBO_ID 列的值,它们都是 VARCHAR,即:
NACION (Nation), SEXO (Sex), etc
我尝试了一些简单的 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;
同样,我仍然得到这个 'numeric conversion error'。
但是,等等,如果我用 NUMBER:
硬编码 COMBO_ID 列中的 SELECT 值
SELECT
--other columns
123456 COMBO_ID,
--other columns
INTO
pRegistro
FROM
crm.info_adicional
它起作用了,管它呢,它被定义为 VARCHAR。
如果我做同样的事情但对字符串进行硬编码,它将无法再次执行
已经在我的 DEV 环境中尝试过,它工作正常。
我不是 Oracle 专家,但我感到很迷茫。
难道tables得到"confused"?
有什么线索吗?
如果您尝试推送一个长度超过 VARCHAR2 容量(在您的情况下为 40)的字符串,也会引发该错误。
尝试检查您尝试插入的所有数据是否正确:
SELECT
COMBO_ID
FROM
crm.info_adicional
ORDER BY length(COMBO_ID) desc;
这也可以解释为什么它在您的 DEV 环境中运行良好,我想,它具有不同的数据。
好的,我已经找到答案了
引用 Oracle 文档:
The %ROWTYPE attribute provides a record type that represents a row in a table or view. Columns in a row and corresponding fields in a record have the same names and datatypes.
因此,基本上,SELECT 语句需要与 table 列定义的顺序相同。
就我而言,我有几列(包括 COMBO_ID)的顺序不同。
尝试过,重新订购,效果非常好。
谢谢大家的支持
我有一个包含多个列的 table,如下所示:
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: error : error de conversión de carácter a número numérico o de valor"
或者 'numeric conversion error',英文。
这个 table 有一些预先存在的数据,我什至发现一些行包括 COMBO_ID 列的值,它们都是 VARCHAR,即:
NACION (Nation), SEXO (Sex), etc
我尝试了一些简单的 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;
同样,我仍然得到这个 'numeric conversion error'。 但是,等等,如果我用 NUMBER:
硬编码 COMBO_ID 列中的 SELECT 值SELECT
--other columns
123456 COMBO_ID,
--other columns
INTO
pRegistro
FROM
crm.info_adicional
它起作用了,管它呢,它被定义为 VARCHAR。 如果我做同样的事情但对字符串进行硬编码,它将无法再次执行
已经在我的 DEV 环境中尝试过,它工作正常。
我不是 Oracle 专家,但我感到很迷茫。 难道tables得到"confused"? 有什么线索吗?
如果您尝试推送一个长度超过 VARCHAR2 容量(在您的情况下为 40)的字符串,也会引发该错误。
尝试检查您尝试插入的所有数据是否正确:
SELECT
COMBO_ID
FROM
crm.info_adicional
ORDER BY length(COMBO_ID) desc;
这也可以解释为什么它在您的 DEV 环境中运行良好,我想,它具有不同的数据。
好的,我已经找到答案了
引用 Oracle 文档:
The %ROWTYPE attribute provides a record type that represents a row in a table or view. Columns in a row and corresponding fields in a record have the same names and datatypes.
因此,基本上,SELECT 语句需要与 table 列定义的顺序相同。
就我而言,我有几列(包括 COMBO_ID)的顺序不同。 尝试过,重新订购,效果非常好。
谢谢大家的支持