2016-10-03 16 views
1

とSQLビューを作成します。私は、次のタイプと表持つオブジェクト識別子

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で初めてのことですが、これは私には苦労しています。ありがとう!

+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

はトップLEVを指定するには、WITH OBJECT IDENTIFIERの句を使用しますel(ルート)オブジェクトビュー。この句を使用すると、オブジェクト・ビューの各行を識別するキーとして使用されるオブジェクト・タイプの属性を指定できます。ほとんどの場合、これらの属性は基本表の主キー列に対応します。属性リストが一意であることを確認し、ビュー内の1つの行を正確に特定する必要があります。私が使用した

name, city, distanceは、オブジェクトを一意に識別しない、とのレースからすべてのランナーが同じobject_id疑似列値を取得します。あなたはそれにyear, timeを追加することができます。これは、2人の人がまったく同じ時間になるまで助けになります(もちろん起こります)。 runner_idを追加することはできません - ORA-22971: invalid datatype for PRIMARY KEY-based object identifierを取得します。

+0

あなたの助けてくれてありがとう、私はもっと多くのことを今理解しています。ご回答いただきありがとうございます。 – Joanmacat

+0

それから、VIEWのPERSONからDNI、NAME、SURNAMEをどのように表示できますか? REF()を使用することを意味しますか? – Joanmacat

+0

なぜオブジェクトビューが必要ですか?あなたは本当に何を達成しようとしていますか? –

0

こんにちは列にマッチしてください、それはあなたのクエリが親の型からのものも含め、使用しているオブジェクト型の各フィールドに対応する列の値を、取得する必要が

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

同じ 'ORA-01730'エラーが発生します。 「参加」は「レース」のサブタイプである(確かではないとは思うが)ので、構築するオブジェクトには親子タイプのフィールドをすべて含めなければならない。 –

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 TYPE AvgTime AS Object (
avg_runner_id VARCHAR(30), 
avg_time  INTEGER 
); 
を埋めるために。これは、リレーショナルテーブルになります

あなたのビューとして

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

オブジェクトのビューを同じatributesを持つビューの型が必要になります

距離のオブジェクトビュー= 10。あなたがオブジェクト型のように、あなたの選択で同じatributesと秩序を必要とすることに注意しますが、オブジェクト識別子

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

に使用すると、オブジェクトリレーショナルテーブルトラフ見るためにビューを使用して、覚えていないしてください。

関連する問題