在Oracle 11gR2中,如何用NESTED TABLE创建“带有NESTED TABLE的类型”的表?

问题描述

在您提出任何问题之前,是的,我正在做一些家庭作业(大学类)。 我正在处理Oracle 11gR2中的嵌套表,并且我有这段代码,显然不起作用(但是为什么不呢?)。我认为缺少了一些东西:

CREATE OR REPLACE TYPE subjects AS VARRAY(20) OF VARCHAR2(100);

CREATE OR REPLACE TYPE Person AS OBJECT(
    name            VARCHAR2(30),last_name       VARCHAR2(128),id_card         VARCHAR2(9)
) NOT FINAL;

CREATE OR REPLACE TYPE Student UNDER Person (
    id_college              VARCHAR2(10),enrolled_subjects       subjects
);

CREATE TABLE Students OF Student;

CREATE OR REPLACE TYPE Student_List AS VARRAY(5) OF REF Student;

CREATE OR REPLACE TYPE PDI UNDER Person (
    id_university       VARCHAR2(10),depto               VARCHAR2(50),date_incorporation  TIMESTAMP
);

CREATE TABLE Pdis OF PDI;

CREATE OR REPLACE TYPE Staff UNDER Person () FINAL;

CREATE TABLE Staff_Members OF Staff;

CREATE OR REPLACE TYPE tStaff AS TABLE OF Staff;

CREATE OR REPLACE TYPE Addendum AS OBJECT (
    idCode          VARCHAR2(10),sign_date       TIMESTAMP,students        student_list,staff_members   tStaff,professor       REF PDI
) FINAL;

CREATE TABLE Addendums OF Addendum
    nesTED TABLE staff_members STORE AS staffmembers_nt;

CREATE OR REPLACE TYPE tAddendum AS TABLE OF Addendum;

-- UNTIL HERE EVERYTHING'S OK

CREATE OR REPLACE TYPE AgreementInter AS OBJECT (
    idCode              VARCHAR2(10),manager_name        VARCHAR2(30),manager_last_name   VARCHAR2(128),addendums           tAddendum
) FINAL;

CREATE TABLE AgreementsInter OF AgreementInter
    nesTED TABLE addendums STORE AS addendums_nt;

使用此代码,我在Oracle中遇到此错误[99999][2320] ORA-02320: failure in creating storage table for nested table column ADDENDUMS。但是我认为我创建表的方式与tStaff表(CREATE OR REPLACE TYPE tStaff AS TABLE OF Staff;)中的方式相同。

也。我在这个问题(How do I create an Oracle table with nested tables of object types?)中看到,我可能必须在上一张表中添加内部嵌套表:

创建表协议Inter OF AgreementInter 嵌套表附录存储为addendums_nt (嵌套表工作人员存储为addendums_staff_members_nt);

但是Oracle却说了同样的错误[99999][2320] ORA-02320: failure in creating storage table for nested table column ADDENDUMS

解决方法

我建议在最后两个步骤中使用一个小费(用staff_members代替staff_members)和一个名称更改(输入tAgreementInter而不是AgreementInter):

CREATE OR REPLACE TYPE tAgreementInter AS OBJECT (
    idCode              VARCHAR2(10),manager_name        VARCHAR2(30),manager_last_name   VARCHAR2(128),addendums           tAddendum
) FINAL;

CREATE TABLE AgreementsInter OF tAgreementInter 
NESTED TABLE addendums STORE AS addendums_nt 
(NESTED TABLE staff_members STORE AS addendums_staff_members_nt)
;

这里是db-fiddle,以显示其效果。