How to update reference oracle

75 Views Asked by At

Im making two object tables, with reference M:M, insert is working correctly, but when im trying to update reference, i get the error.

Error: SQL Error: ORA-00904: "A"."ATS_PN": "%s: invalid identifier"

CREATE OR REPLACE TYPE STUDENTI AS OBJECT(
    S_NUM   INT,
    S_UZV   VARCHAR2(30)
);

CREATE OR REPLACE TYPE PASNIEDZEJI AS OBJECT(
    P_NUM   INT,
    P_UZV   VARCHAR2(30)
);

CREATE OR REPLACE TYPE ATS_ST AS OBJECT(
    ID  INT,
    ST_ID REF STUDENTI
);

CREATE OR REPLACE TYPE ATS_PN AS OBJECT(
    ID  INT,
    PN_ID REF PASNIEDZEJI
);

CREATE OR REPLACE TYPE ATS_P AS TABLE OF ATS_PN;
CREATE OR REPLACE TYPE ATS_S AS TABLE OF ATS_ST;

CREATE OR REPLACE TYPE O_STUDENTI AS OBJECT(
    STUD STUDENTI,
    PASN ATS_P
);

CREATE OR REPLACE TYPE O_PASNIEDZEJI AS OBJECT(
    PASN PASNIEDZEJI,
    STUD ATS_S
);

CREATE TABLE T_STUDENTI OF O_STUDENTI
NESTED TABLE PASN STORE AS P_TBL;

CREATE TABLE T_PASNIEDZEJI OF O_PASNIEDZEJI
NESTED TABLE STUD STORE AS S_TBL;

INSERT INTO T_STUDENTI VALUES (STUDENTI(191, 'BRONES'), NULL);

INSERT INTO T_PASNIEDZEJI VALUES (PASNIEDZEJI(53, 'JHONES'), NULL);
INSERT INTO T_PASNIEDZEJI VALUES (PASNIEDZEJI(54, 'HIKKAEV'), NULL);

UPDATE T_STUDENTI A SET A.PASN = (1, 'TEST') WHERE A.STUD.S_NUM = 191; --misstake some where ther :/
1

There are 1 best solutions below

1
On

I'm not following what you are doing functionally, but I've removed the REF from your objects because it's hard to deal with in SQL.

You'll notice that t_studenti.pasn is ats_p which is a table of ats_pn which contains an id and a pasniedzeji: you must construct that entire hierarchy.

This code will let you update the table:

CREATE OR REPLACE TYPE STUDENTI AS OBJECT(
    S_NUM   INT,
    S_UZV   VARCHAR2(30)
);

CREATE OR REPLACE TYPE PASNIEDZEJI AS OBJECT(
    P_NUM   INT,
    P_UZV   VARCHAR2(30)
);

CREATE OR REPLACE TYPE ATS_ST AS OBJECT(
    ID  INT,
    ST_ID STUDENTI
);

CREATE OR REPLACE TYPE ATS_PN AS OBJECT(
    ID  INT,
    PN_ID PASNIEDZEJI
);

CREATE OR REPLACE TYPE ATS_P AS TABLE OF ATS_PN;
CREATE OR REPLACE TYPE ATS_S AS TABLE OF ATS_ST;

CREATE OR REPLACE TYPE O_STUDENTI AS OBJECT(
    STUD STUDENTI,
    PASN ATS_P
);

CREATE OR REPLACE TYPE O_PASNIEDZEJI AS OBJECT(
    PASN PASNIEDZEJI,
    STUD ATS_S
);

CREATE TABLE T_STUDENTI OF O_STUDENTI
NESTED TABLE PASN STORE AS P_TBL;

CREATE TABLE T_PASNIEDZEJI OF O_PASNIEDZEJI
NESTED TABLE STUD STORE AS S_TBL;

INSERT INTO T_STUDENTI VALUES (STUDENTI(191, 'BRONES'), NULL);

INSERT INTO T_PASNIEDZEJI VALUES (PASNIEDZEJI(53, 'JHONES'), NULL);
INSERT INTO T_PASNIEDZEJI VALUES (PASNIEDZEJI(54, 'HIKKAEV'), NULL);

UPDATE t_studenti a
   SET a.pasn = ats_p(ats_pn(1, -- ??
                             pasniedzeji(1,
                                         'TEST')))
 WHERE a.stud.s_num = 191;