在Oracle中检索对象

时间:2018-08-14 05:51:51

标签: oracle select-query oracledb oracle-type

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

菜单类型

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

啤酒类型

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

使用菜单类型创建的表

Create table Sells of Menu

使用啤酒类型创建的表

Create table beer of beertype

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

我尝试过

SELECT beer.name 
FROM Sells; 

SELECT Sells.beer.name 
FROM Sells; 

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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 <>提琴here