Oracle База данных - REF неподдерживаемый тип данных - PullRequest
0 голосов
/ 30 апреля 2020

Итак, у меня есть три стола: Персонал, Книга и Продажа.

Для персонала:

 CREATE TYPE StaffType AS OBJECT (
     ID VARCHAR2(5),
     Name VARCHAR2(30)
     );
/
    CREATE TABLE Staff of StaffType;

Для книги:

CREATE TYPE BookType AS OBJECT (
 B_ID VARCHAR2(8));
/
 CREATE TABLE Book of TicketType;

Для продажи:

CREATE TYPE SaleType AS OBJECT (
 S_ID VARCHAR2(8),
 S_Date VARCHAR2(10),
 Price NUMBER(10),
 With REF StaffType,
 For REF BookType );
/
CREATE TABLE Sale of SaleType (
 Scope for (With) is Staff,
 Scope for (For) is Book);

Поэтому я вставил строку в таблицу продажи как это

insert into Sale VALUES(SaleType('S12','33th',22,(SELECT REF(c) FROM Staff c WHERE c.ID='C13'),(SELECT REF(t) FROM Book t WHERE t.B_ID='T18'));

однако я получаю следующую ошибку:

ORA-00917: missing comma 

Я не понимаю, почему я получаю эту ошибку .. Какую запятую я пропустил? РЕДАКТИРОВАТЬ: Я следовал решению @thatjeffsmith и, хотя оператор вставки работает, когда я пытаюсь просмотреть свою таблицу, я получаю следующую ошибку:

ORA-00932: inconsistent datatypes: expected CHAR got REF SQL_VTJOLYEBVKAOJEHORTCXVPTBP.STAFFTYPE

вот код .. Я удалил HR. до объявления таблицы Book and Staff from sale, потому что это привело к появлению на листе сообщения об ошибке, указывающей на то, что Staff и Book находятся вне области видимости. Вот код:

CREATE TYPE STAFFTYPE AS OBJECT (
       ID    VARCHAR2(5),
       NAME  VARCHAR2(30)
);
/
CREATE TABLE STAFF OF STAFFTYPE;
/
INSERT INTO STAFF VALUES('C13','James');
/
CREATE TYPE BOOKTYPE AS OBJECT (
       B_ID VARCHAR2(8)
);
/
CREATE TABLE BOOK OF BOOKTYPE;
/
INSERT INTO BOOK VALUES('T18');
/
CREATE TYPE SALETYPE AS OBJECT (
       S_ID    VARCHAR2(8),
       S_DATE  VARCHAR2(10),
       PRICE   NUMBER(10),
       WITHS   REF STAFFTYPE,
       FORS    REF BOOKTYPE
);
/
CREATE TABLE SALE OF SALETYPE (
       SCOPE FOR ( WITHS ) IS STAFF,
       SCOPE FOR ( FORS ) IS BOOK
);
INSERT INTO SALE VALUES ( SALETYPE(
       'S12', '33th',
       22,
       (
              SELECT REF(C)
                FROM STAFF C
               WHERE C.ID = 'C13'
       ),
       (
              SELECT REF(T)
                FROM BOOK T
               WHERE T.B_ID = 'T18'
       )
) );

SELECT * FROM SALE;

1 Ответ

0 голосов
/ 30 апреля 2020

WITH и FOR - ключевые слова, недоступные в качестве имени таблицы или столбца. Вы могли бы «ЦИТИРОВАТЬ» их, но НЕ ДЕЛАЙТЕ ЭТОГО - это сделает вашу жизнь намного сложнее в будущем.

Ваша таблица BOOK неверна, вы используете ТИП, которого нет в вашем примере.

А в вашей ВСТАВКЕ отсутствует последний ')'

CREATE TYPE STAFFTYPE AS OBJECT (
       ID    VARCHAR2(5),
       NAME  VARCHAR2(30)
);
/
CREATE TABLE STAFF OF STAFFTYPE;
CREATE TYPE BOOKTYPE AS OBJECT (
       B_ID VARCHAR2(8)
);
/
CREATE TABLE BOOK OF BOOKTYPE;
CREATE TYPE SALETYPE AS OBJECT (
       S_ID    VARCHAR2(8),
       S_DATE  VARCHAR2(10),
       PRICE   NUMBER(10),
       WITHS   REF STAFFTYPE,
       FORS    REF BOOKTYPE
);
/
CREATE TABLE SALE OF SALETYPE (
       SCOPE FOR ( WITHS ) IS HR.STAFF,
       SCOPE FOR ( FORS ) IS HR.BOOK
);

INSERT INTO SALE VALUES ( SALETYPE(
       'S12', '33th',
       22,
       (
              SELECT REF(C)
                FROM STAFF C
               WHERE C.ID = 'C13'
       ),
       (
              SELECT REF(T)
                FROM BOOK T
               WHERE T.B_ID = 'T18'
       )
) );

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...