具有对象类型主键的PL/SQL

具有对象类型主键的PL/SQL,sql,oracle,Sql,Oracle,我创建对象关系类型如下 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

我创建对象关系类型如下

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));
现在我想为“Sedan”表设置如下的主要参数

CREATE TABLE sedan OF sedan_t (PRIMARY KEY (familycar_t.make,familycar_t.model));
但是错误会像这样发生

从命令中的第4行开始出错-创建表sedan\u t (主键(familycar\u t.make,familycar\u t.model))错误报告-SQL 错误:ORA-00904:“家庭卡”“MAKE”:无效标识符 90400000-%s:无效标识符 *原因:
*行动:


解决方案是什么?

您不能对类型为REF的属性创建索引(请参阅)。 如果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.

使用引用的替代方法是使用继承:

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) 

您是否尝试过:
主键(familycar.make,familycar.model)
?也就是说,引用对象,而不是类型。我尝试了以下方法,但不正确。。。创建轿车的表轿车(主键(make%familycar,model%familycar));创建轿车的表轿车(主键(familycar.make%familycar\t,familycar.model%familycar\t));创建轿车的表轿车(主键(familycar.make%familycar\t,familycar.model%familycar\t));