使用对象标识

时间:2016-10-03 15:28:59

标签: sql oracle

我有以下类型和表格:

CREATE TYPE person AS OBJECT (
dni VARCHAR2(10),
name VARCHAR2(30),
surname VARCHAR2(100)
)NOT FINAL;

CREATE TYPE runner UNDER person (
runningClub VARCHAR2(100)
);

CREATE TYPE race AS OBJECT (
name VARCHAR2(50),
city VARCHAR2(50),
distance INTEGER
)NOT FINAL;

CREATE TYPE participation UNDER race(
    runner_id runner,
    year VARCHAR(4),
    time INTEGER
);

CREATE TABLE participations OF participation;

现在我需要创建一个VIEW,我尝试了这个:

CREATE VIEW AvgTime10k OF PARTICIPATION WITH OBJECT IDENTIFIER (runner_id, year, time) AS
SELECT runner_id, time FROM PARTICIPATIONS WHERE DISTANCE = '10';

但我得到的错误是:错误SQL:ORA-01730:指定的列名无效

有人知道为什么吗?这是我第一次使用对象关系SQL,这让我很烦恼。谢谢!

3 个答案:

答案 0 :(得分:2)

您的查询需要获取与您正在使用的对象类型中的每个字段相对应的列值,包括来自父类型的字段:

CREATE VIEW AvgTime10k OF PARTICIPATION WITH OBJECT IDENTIFIER (name, city, distance) AS
SELECT name, city, distance, runner_id, year, time
FROM PARTICIPATIONS WHERE DISTANCE = '10';

View AVGTIME10K created.

然而,from the documentation

  

使用WITH OBJECT IDENTIFIER子句指定顶级(根)对象视图。此子句允许您指定将用作标识对象视图中每一行的键的对象类型的属性。在大多数情况下,这些属性对应于基表的主键列。您必须确保属性列表是唯一的,并确定视图中的一行。

我使用的name, city, distance并不能唯一地标识一个对象,并且来自一个种族的所有参赛者将获得相同的object_id伪列值。你可以添加year, time,这将有所帮助,除非两个人得到完全相同的时间(当然会发生);但是您无法添加runner_id - 您将获得ORA-22971: invalid datatype for PRIMARY KEY-based object identifier

答案 1 :(得分:2)

当您想通过关系表访问对象信息时,使用对象视图。

我认为种族和跑步者应该拥有自己的对象类型和对象表,但参与必须是关系表。例如:

CREATE TYPE race_t AS OBJECT (
 ra_name VARCHAR(30),
 ....
);

CREATE TABLE race_o of race_t (ra_name PRIMARY KEY)
OBJECT IDENTIFIER IS PRIMARY KEY;

CREATE TYPE runner_t AS OBJECT (
ru_dni VARCHAR(10),
...
);

CREATE TABLE runner_o of runner_t (ru_dni PRIMARY KEY)
OBJECT IDENTIFIER IS PRIMARY KEY;

此外,您必须为距离为10公里的人创建一个视图?

您需要一个关系表来使用对象视图。此外,您需要一个视图类型,其视图属性与视图相同

这将是关系表

CREATE TABLE PARTICIPACIONS (
--You must use a REF with SCOPE for race, and a REF with SCOPE for runner
...
);

用于填充视图的对象视图

CREATE TYPE AvgTime AS Object (
avg_runner_id VARCHAR(30),
avg_time      INTEGER
);

距离= 10的对象视图。请注意,您需要在对象类型中选择相同的属性和顺序,但不需要在对象标识符中

CREATE VIEW AvgTime10k OF PARTICIPATION WITH OBJECT IDENTIFIER (avg_runner_id) AS
SELECT p.runner_id, p. time FROM PARTICIPATIONS P WHERE DISTANCE = '10';
)

请记住,您使用视图通过关系表查看对象。

答案 2 :(得分:0)

嗨请匹配列,这很简单

CREATE VIEW AvgTime10k OF PARTICIPATION WITH OBJECT IDENTIFIER (runner_id, year, time) AS
SELECT runner_id, year, time FROM PARTICIPATIONS WHERE DISTANCE = '10';