Я пытаюсь создать таблицу и получаю сообщение об ошибке invalid datatype. Я попытался изменить переменные, но ошибка осталась. Кто-нибудь может мне помочь?

Код:

CREATE TABLE DETALLEFACTURA (
    NUMERO_FACTURA_DETALLE NUMBER(15),
    NUMERO_DETALLE_FACTURA VARCHAR(20),
    CODIGO_ARTICULO VARCHAR(20),
    CANTIDAD NUMBER(6),
    PORCENTAJE_GANANCIA NUMBER(10),
    PRECIO NUMBER(8),
    CONSTRAINT DETALLE_PK PRIMARY KEY(NUMERO_FACTURA_DETALLE,NUMERO_DETALLE_FACTURA), 

    CONSTRAINT (NUMERO_FACTURA_DETALLE_FK) FOREIGN KEY(NUMERO_FACTURA_DETALLE) REFERENCES FACTURA(NUMERO_FACTURA) on delete cascade,
    CONSTRAINT (NUMERO_DETALLE_FACTURA_FK) FOREIGN KEY(NUMERO_DETALLE_FACTURA) REFERENCES ARTICULO(CODIGO_ARTICULO) on delete cascade
);

Ошибка

ORA-00902: invalid datatype

Заранее всем спасибо!

-1
dansan 1 Авг 2017 в 19:43

1 ответ

Лучший ответ

Ошибка возникает из-за скобок, заключенных в имена ограничений; это получает ту же ошибку:

create table FACTURA(NUMERO_FACTURA NUMBER(15) primary key);
create table ARTICULO(CODIGO_ARTICULO VARCHAR(20) primary key);

CREATE TABLE DETALLEFACTURA(
NUMERO_FACTURA_DETALLE NUMBER(15),
NUMERO_DETALLE_FACTURA VARCHAR(20),
CODIGO_ARTICULO VARCHAR(20),
CANTIDAD NUMBER(6),
PORCENTAJE_GANANCIA NUMBER(10),
PRECIO NUMBER(8),
CONSTRAINT DETALLE_PK PRIMARY KEY(NUMERO_FACTURA_DETALLE,NUMERO_DETALLE_FACTURA), 
CONSTRAINT (NUMERO_FACTURA_DETALLE_FK) FOREIGN KEY(NUMERO_FACTURA_DETALLE) REFERENCES FACTURA(NUMERO_FACTURA) on delete cascade,
CONSTRAINT (NUMERO_DETALLE_FACTURA_FK) FOREIGN KEY(NUMERO_DETALLE_FACTURA) REFERENCES ARTICULO(CODIGO_ARTICULO) on delete cascade
);

ORA-00902: неверный тип данных

Это не так:

CREATE TABLE DETALLEFACTURA(
NUMERO_FACTURA_DETALLE NUMBER(15),
NUMERO_DETALLE_FACTURA VARCHAR(20),
CODIGO_ARTICULO VARCHAR(20),
CANTIDAD NUMBER(6),
PORCENTAJE_GANANCIA NUMBER(10),
PRECIO NUMBER(8),
CONSTRAINT DETALLE_PK PRIMARY KEY(NUMERO_FACTURA_DETALLE,NUMERO_DETALLE_FACTURA), 
CONSTRAINT NUMERO_FACTURA_DETALLE_FK FOREIGN KEY(NUMERO_FACTURA_DETALLE) REFERENCES FACTURA(NUMERO_FACTURA) on delete cascade,
CONSTRAINT NUMERO_DETALLE_FACTURA_FK FOREIGN KEY(NUMERO_DETALLE_FACTURA) REFERENCES ARTICULO(CODIGO_ARTICULO) on delete cascade
);

Table DETALLEFACTURA created.

Единственное отличие - это снятие скобок с двух последних ограничений.


Кстати, Oracle рекомендует использовать varchar2 вместо varchar; это не вызовет ошибок, но вызовет путаницу, и по возможности лучше следовать их рекомендациям. Они говорили, что это будет пересмотрено, сколько я себя помню, но кто знает, это может случиться однажды ...

1
Alex Poole 1 Авг 2017 в 19:54
По поводу вашего последнего комментария («это может случиться однажды ...») - не могу дождаться! Основная причина переопределения VARCHAR, насколько я понимаю, связана с тем, что Oracle придерживается стандарта SQL - в частности, позволяет использовать пустые строки как отличные от NULL. (Пустые строки и NULL - это одно и то же в Oracle, вопреки стандарту SQL и логике.)
 – 
mathguy
2 Авг 2017 в 00:11
Нет ничего лучше, чем поставить себя в неловкое положение, напористо дав неправильный ответ. Я удалил свой предыдущий ответ по вашему предложению.
 – 
Brian Leach
2 Авг 2017 в 21:07
- Ничего смущающего в этом нет - я все время даю неправильные ответы, и мне комфортно знать, что я пытался помочь ОП, и (обычно) была причина, по которой я думал, что ответ правильный, даже если это не так. У меня много собственных ответов, и это нормально; Я удаляю их (с отрицательными голосами или без них), когда понимаю, что они ошибаются или не относятся к OP. Мы все делаем все возможное, чтобы сайт оставался максимально полезным. (Или я не должен говорить, что мы все , поскольку это неправда; по крайней мере, многие из нас!) Спасибо за помощь!
 – 
mathguy
2 Авг 2017 в 21:26