Как выполнить запрос из двух таблиц с оператором TABLE?

Выполняю задание:

You must define a collection type to hold the attributes of a line item. Then create a table to hold the invoice data including information about its line items. Do not define a separate table for item. Simply include the attributes of any item that is referenced in a line item directly within the line item itself.
You need to create three invoices using the line item data shown below.

INVOICE# SHIPDATE TERMS ITEMID DESCRIPTION QUANTITY UNITPRICE LINETOTAL
-------- --------- --------------- ------- ---------------------------- -------- --------- ----------
INV001 27-APR-18 CREDIT A000100 GREEN WIDGET 1 35.10 35.10 
                        A000200 BLUE WIDGET 3 35.10 105.30

INV002 27-APR-18 Due on Receipt A001000 WHITE WIDGET 5 35.10 175.50
                                A000800 ORANGE THREE-HANDLED WIDGET 8 45.99 367.92
                                A000200 BLUE WIDGET 6 35.10 210.60
                                A000700 YELLOW THREE-HANDLED WIDGET 2 43.25 86.50
                                A000400 ORANGE WIDGET 1 45.99 45.99
INV003 27-APR-18 Due on Receipt

Затем, нужно следующим запросом получить список всех фактур и товаров в них:

SELECT LI.*
FROM INVOICE I, TABLE(I.LINEITEMS) LI;

Я создал таблицы и заполнил их данными:

CREATE TABLE Invoice(
    INVOICE# VARCHAR(50) not null,
    SHIPDATE date,
    TERMS VARCHAR(50)
);
CREATE TABLE LineItems(
    ItemId VARCHAR(50)  not null,
    Quantity int  not null,
    Description VARCHAR(50) not null,
    UNITPRICE decimal (10,5) not null,
    LineTotal decimal (10,5) not null
);

Но когда я выполняю запрос, то получаю ошибку:

ORA-00904: "I"."LINEITEMS": invalid identifier

Что я делаю не так?


Ответы (1 шт):

Автор решения: 0xdb

Вложенную таблицу надо обьявить как столбец в таблице Invoice. Таблица LineItems будет создана автоматически кaк указано в клаузе STORE AS. Вот так:

create or replace type LineItemT as object (
    ItemId varchar (50),
    Quantity int,
    Description varchar (50) ,
    UnitPrice decimal (10,5) ,
    LineTotal decimal (10,5)
    )
/    
create or replace type LineItemsТ as table of LineItemТ
/
create table Invoice (
    Invoice# varchar (50) not null,
    shipdate date,
    terms VARCHAR(50),
    LineItems LineItemsT 
)
nested table LineItems store as LineItems
/

Заполните данными и запрос будет работать:

insert into Invoice values (
    'INV001', date'27-04-18', 'CREDIT', 
    LineItemsT (LineItemT ('A000100', 1, 'GREEN WIDGET', 35.10, 35.10),
                LineItemT ('A000200', 6, 'BLUE WIDGET',  35.10, 210.60)));

select Invoice# invNo, li.* 
from invoice i, table (i.lineitems) li;

INVNO      ITEMID       QUANTITY DESCRIPTION       UNITPRICE  LINETOTAL
---------- ---------- ---------- ---------------- ---------- ----------
INV001     A000100             1 GREEN WIDGET     35,1       35,1      
INV001     A000200             6 BLUE WIDGET      35,1       210,6       

На db<>fiddle.

→ Ссылка