使用具有超类型属性的类型创建对象表

Sug*_*lai 9 oracle

我正在尝试创建一个oracle-object类型的oracle表.

这是我的对象结构的样子

CREATE OR REPLACE TYPE PERS_T AS OBJECT 
( 

 empno number(4)
, ename varchar2(10)
, job varchar2(9)
, hiredate DATE
, sal number(7,2)
, comm number(7,2)
, deptno number(2)
)NOT FINAL;

CREATE OR REPLACE TYPE EMP_T FORCE UNDER pers_t (
  mgr pers_t
);
Run Code Online (Sandbox Code Playgroud)

所有这些都很好,但当我尝试使用时创建一个EMP_T类型表

CREATE TABLE table_name(emp_type EMP_T);
Run Code Online (Sandbox Code Playgroud)

我收到了错误

SQL Error: ORA-30756: cannot create column or table of type that contains a supertype attribute
Run Code Online (Sandbox Code Playgroud)

在oracle中可以创建这样的表吗?

Rob*_*aro 2

我不这么认为。根据Oracle自己的支持数据库,以下适用于ora-30756

ORA-30756 消息文件中的错误文本、原因和操作

版本 9.2、10.1、10.2、11.1、11.2、12.1

错误:ORA-30756 无法创建包含超类型属性的类型的列或表

原因:用户尝试创建包含超类型属性的对象类型的列或表。这是不支持的,因为它会导致我们当前的存储模型中的无限递归。请注意,创建类型的列意味着我们也创建与所有子类型属性相对应的列。操作:更改类型定义以包含超类型 REF 属性而不是超类型对象属性。

您已经创建了一个超级类型 PERS_T 所以我相信这是您的问题。正如文章所述,您可以创建引用属性而不是对象属性作为解决方法,如 @tbone 所解释的 - CREATE TABLE table_name(emp_type REF EMP_T);