2016-10-01 98 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 sedan OF sedan_t(PRIMARY KEY(make%familycar,model%familycar)); CREATE TABLE sedan OF sedan_t(PRIMARY KEY(familycar.make%familycar_t,familycar.model%familycar_t)); CREATE TABLE sedan OF sedan_t(PRIMARY KEY(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. 
相关问题