在 Oracle 中检索对象

Retrieve objects in Oracle

我有一个名为 Menu 的 Oracle 对象,它有一个对象类型作为属性。

菜单类型

Create Type Menu as Object( beer REF beertype, price float )

啤酒类型

Create Type beertype as object( name char(20), seller char(20) )

table 使用菜单类型创建

Create table Sells of Menu

table 使用 beertype

创建
Create table beer of beertype

现在我想做的是编写一个 select 查询来检索价格超过 3.5 的啤酒的名称。

我试过了

SELECT beer.name 
FROM Sells; 

SELECT Sells.beer.name 
FROM Sells; 

这是一个例子:首先测试用例:

SQL> create type beertype as object(
  2    name char(20),
  3    seller char(20)
  4  );
  5  /

Type created.

SQL> create type menu as object(
  2    beer ref beertype,
  3    price float
  4  );
  5  /

Type created.

SQL> create table sells of menu;

Table created.

SQL> create table beer of beertype;

Table created.

SQL> insert into beer (name, seller) values ('Heineken', 'KTC');

1 row created.

SQL> insert into beer (name, seller) values ('Tuborg', 'Plodine');

1 row created.

SQL> insert into sells (beer, price) values ((select ref(b) from beer b where name = 'Heineken'), 10);

1 row created.

SQL> insert into sells (beer, price) values ((select ref(b) from beer b where name = 'Tuborg'), 2.5);

1 row created.

选择价格大于3.5的啤酒名称的查询:

SQL> select b.name, s.price
  2  from sells s join beer b on value(b) = deref(s.beer)
  3  where s.price > 3.5;

NAME                      PRICE
-------------------- ----------
Heineken                     10

SQL>

这是一篇不错的文章,如果您想阅读更多:Using REF Values for Retrieval of Data Values

您不需要使用 JOIN 来获取名称;您可以只使用 DEREF 或在 SELECT 子句中链接 reference/attribute 名称:

select DEREF(s.beer).name AS name, s.price
from   sells s
where  s.price > 3.5;

select s.beer.name AS name, s.price
from   sells s
where  s.price > 3.5;

(第一个选项清楚地表明您正在取消引用 REF,而第二个选项更简洁。)

输出:

NAME                 | PRICE
:------------------- | ----:
Heineken             |    10

db<>fiddle here