2016-10-01 3 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

Вы пробовали: 'ПЕРВИЧНЫЙ КЛЮЧ (familycar.make, familycar.model)'? То есть, ссылайтесь на объект, а не на тип. –

+0

Я пробовал под способами, но не правильно ... CREATE TABLE седан седан_t (ПЕРВИЧНЫЙ КЛЮЧ (make% familycar, model% familycar)); CREATE TABLE седан седан_t (ПЕРВИЧНЫЙ КЛЮЧ (familycar.make% familycar_t, familycar.model% familycar_t)); CREATE TABLE седан седан_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)); 

Однако, вы на самом деле не нужны sedan таблиц в этом случае:

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.