No Oracle 11gR2, como CRIAR TABELA de “Type with NESTED TABLE” com NESTED TABLE?

Sep 30 2020

Antes de qualquer dúvida, sim, estou fazendo um dever de casa (tipo universitário). Estou lidando com tabelas aninhadas no Oracle 11gR2 e tenho esse código, que não está funcionando, obviamente (mas por que não?). Acho que falta algo:

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;

Com este código eu tenho esse erro no Oracle: [99999][2320] ORA-02320: failure in creating storage table for nested table column ADDENDUMS. Mas acho que criei a tabela da mesma forma que na tabela tStaff ( CREATE OR REPLACE TYPE tStaff AS TABLE OF Staff;).

Além disso. Eu vi nesta pergunta ( como faço para criar uma tabela Oracle com tabelas aninhadas de tipos de objeto? ) Que posso ter que adicionar tabela aninhada interna na minha última tabela:

CREATE TABLE AgreementsInter OF AgreementInter NESTED TABLE addendums STORE AS addendums_nt (NESTED TABLE staffmembers STORE AS addendums_staff_members_nt);

Mas, então, a Oracle diz o mesmo erro: [99999][2320] ORA-02320: failure in creating storage table for nested table column ADDENDUMS.

Respostas

1 casenonsensitive Sep 30 2020 at 09:30

Há um tippo (staff_members em vez de staffmembers) e uma mudança de nome (digite tAgreementInter em vez de AgreementInter), sugiro para as duas últimas etapas:

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)
;

Aqui está um db-fiddle para mostrar que funciona.