简体   繁体   中英

Oracle Database - REF unsupported data type

So I have three tables, Staff, Book, and Sale.

For Staff:

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

For Book:

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

For Sale:

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);

So I inserted a row in Sale table like this

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'));

however, I get the following error:

ORA-00917: missing comma 

I don't understand why I am getting this error.. What comma did I miss? EDIT: I followed the solution of @thatjeffsmith and although the insert statement works, when I try to view my table, I get the following error:

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

here is the code.. I removed HR. before Book and Staff from sale table declaration because that was causing the worksheet to show an error stating that Staff and Book are out of scope. Here is the code:

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;

WITH and FOR are keywords, not available as a table or column name. You could "QUOTE" these, but DO NOT DO THAT - it will make your life much harder going forward.

Your BOOK table is wrong, you're using a TYPE that doesn't exist per your example.

And your INSERT is missing the last ')'

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'
       )
) );

在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM