oracle中的rtrim错误

时间:2015-03-03 18:58:18

标签: mysql oracle

我在oracle中声明了这些表。 referencias已加载数据,我想在envase中加载一些属性。如果我运行以下插入,我得到一个01722无效数字oracle。什么是rtrim格式来避免错误?

CREATE TABLE envase (
referencia VARCHAR2(15) NOT NULL,
descripcion VARCHAR2(50) NOT NULL,
precio number(9,2) NOT NULL,
CONSTRAINT PK_ENVASE PRIMARY KEY (referencia)
);

CREATE TABLE referencias( 
producto      VARCHAR2(50),
codBarras     VARCHAR2(15),
tipoProducto  VARCHAR2(20),
marcaCafetera VARCHAR2(10),
modelCafetera VARCHAR2(12),
tipoCafe      VARCHAR2(10),
varietal      VARCHAR2(30),
procedencia   VARCHAR2(15),
tueste        VARCHAR2(10),
proceso       VARCHAR2(12),
envase        VARCHAR2(15),
precio        VARCHAR2(10),
stock         NUMBER(5),
min_stock     NUMBER(5),
max_stock     NUMBER(5),
coste         VARCHAR(10),
proveedor     VARCHAR2(35),
CIF           VARCHAR2(10),
Comercial     VARCHAR2(90),
email         VARCHAR2(60),
telefono      NUMBER(9), 
cuentaBank    VARCHAR2(30),
TipoVia       VARCHAR2(10),
nombreVia     VARCHAR2(30),
portal        VARCHAR2(3),
bloque        NUMBER(1),
escalera      NUMBER(2),
planta        VARCHAR2(7),
puerta        VARCHAR2(1),
CP            NUMBER(5),
localidad     VARCHAR2(45),
pais          VARCHAR2(45)
);


INSERT INTO envase
(referencia,descripcion,precio)
SELECT DISTINCT
codBarras, envase,TO_NUMBER(RTRIM(precio,' €'),'999999999.99')
FROM referencias;

2 个答案:

答案 0 :(得分:0)

你宣布它为:

precio number(9,2) NOT NULL,

NUMBER(9,2)

表示9个数字..其中2个是小数。 最大人数:9999999.99

但是,您的数字模式似乎是:

codBarras, envase,TO_NUMBER(RTRIM(precio,' €'),'999999999.99')

其中有11位数,其中2位为小数。

我假设您的数据大于1000万,这会在插入期间将其炸毁。

将envase的初始创建更改为11,2而不是9,2并再次尝试?

CREATE TABLE envase (
referencia VARCHAR2(15) NOT NULL,
descripcion VARCHAR2(50) NOT NULL,
precio number(11,2) NOT NULL,
CONSTRAINT PK_ENVASE PRIMARY KEY (referencia)
);

[编辑] 虽然当我测试它时,我得到了 ORA-01438: value larger than specified precision allowed for this column ;)所以它可能是别的东西或问题的组合...... [/编辑]

答案 1 :(得分:0)

我建议简单地从“to_number”中取消格式掩码,并允许Oracle找出数字格式:

这对我来说很好用:

select to_number(rtrim('4.10 €', ' €')) from dual;