2016-10-01 8 views
1

私は以下のようにオブジェクトの関係型を作成しています。オブジェクト型を持つPL/SQL PRIMARY KEY

CREATE OR REPLACE TYPE familycar_t AS OBJECT (
make VARCHAR (10), 
model VARCHAR(10), 
year NUMBER (4), 
fuel_type VARCHAR (10)); 
/

CREATE OR REPLACE TYPE sedan_t AS OBJECT (
familycar ref familycar_t, 
cylinder_Size number(10)); 
/

CREATE TABLE familycar OF familycar_t (PRIMARY KEY (make,model)); 

ここで、次のように「セダン」テーブルのプライマリを設定します。

CREATE TABLE sedan OF sedan_t (PRIMARY KEY (familycar_t.make,familycar_t.model)); 

が、エラーなどの発生、

Error starting at line : 4 in command - CREATE TABLE sedan OF sedan_t (PRIMARY KEY (familycar_t.make,familycar_t.model)) Error report - SQL Error: ORA-00904: "FAMILYCAR_T"."MAKE": invalid identifier 00904. 00000 - "%s: invalid identifier" *Cause:
*Action:

そのための解決策は何ですか

+1

あなたは試しましたか? 'PRIMARY KEY(familycar.make、familycar.model) '?つまり、型ではなくオブジェクトを参照します。 –

+0

私は以下の方法を試してみましたが、正しくありません... sedan_tのsedan(プライマリキー(make%familycar、model%familycar)); CREATE TABLE sedan OF sedan_t(プライマリキー(familycar.make%familycar_t、familycar.model%familycar_t)); CREATE TABLE sedan OF sedan_t(プライマリキー(familycar.make%familycar_t、familycar.model%familycar_t)); – Chamal

答えて

1

参照を使用する代わりに、継承を使用することです:

CREATE OR REPLACE TYPE familycar_t AS OBJECT (
    make VARCHAR (10), 
    model VARCHAR(10), 
    year NUMBER (4), 
    fuel_type VARCHAR (10) 
) NOT FINAL; 
/

CREATE OR REPLACE TYPE sedan_t UNDER familycar_t (
    cylinder_Size number(10) 
); 
/

CREATE TABLE familycar OF familycar_t (PRIMARY KEY (make,model)); 

CREATE TABLE sedan OF sedan_t (PRIMARY KEY (make,model)); 

しかし、あなたは本当にこのケースで​​テーブルは必要ありません。

INSERT INTO familycar 
SELECT sedan_t('Ford', 'Model-T', 1908, 'Petrol', 4) FROM DUAL UNION ALL 
SELECT familycar_t('Ford', 'Model-A', 1903, 'Petrol') FROM DUAL; 

SELECT f.*, 
     TREAT(VALUE(f) AS sedan_t).cylinder_size AS cylinder_size 
FROM familycar f; 

が出力を:

MAKE  MODEL   YEAR FUEL_TYPE CYLINDER_SIZE 
---------- ---------- ---------- ---------- ------------- 
Ford  Model-T   1908 Petrol     4 
Ford  Model-A   1903 Petrol   (null) 
+0

はい、これは正解です。ありがとうございました – Chamal

0

タイプがREFの属性にインデックスを作成することはできません(here参照)。 REFがスコープされている場合にのみ、REF属性または列にインデックスを定義できます。

CREATE OR REPLACE TYPE sedan_t AS OBJECT (
    familycar familycar_t, 
    cylinder_Size number(10) 
    ); 
/
CREATE TABLE sedan OF sedan_t (PRIMARY KEY (familycar.make, familycar.model)); 

Table SEDAN created. 
関連する問題