sql - 具有对象类型 PRIMARY KEY 的 PL/SQL

标签 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 TABLE familycar OF familycar_t (PRIMARY KEY (make,model));

现在我想为“Sedan”表设置主表,如下所示。

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:

有什么解决办法吗?

最佳答案

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

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 table :

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) 

关于sql - 具有对象类型 PRIMARY KEY 的 PL/SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39807923/

相关文章:

sql - 如何在 Excel 中使用 SQL 连接

java - JPA/Hibernate 选择查询返回重复记录

mysql - 多个表的内部连接,计数和不同

java - 使用 JDBC 将 Sql 查询结果集导出到逗号分隔的文件

sql - 在 Rails 中连接不相关的表

c++ - 如何使用 Oracle 存储过程中的 C++ 函数

java - 出于单元测试的目的,哪个内存中 Java 数据库最接近 MySQL 和 SqlServer?

sql - 使用 NHibernate 选择每第 n 行

oracle - 动态Sqoop查询和调度

Oracle 12c 在带有外键的表上使用 onDelete 触发器和 onDelete 级联 setNull 抛出 ORA-00600 : Internal Errorcode, 参数:[13001]