【问题标题】:How to update reference oracle如何更新参考预言机
【发布时间】:2021-03-13 10:00:35
【问题描述】:

我正在制作两个对象表,引用 M:M,插入工作正常,但是当我尝试更新引用时,我得到了错误。

错误: SQL 错误:ORA-00904:“A”。“ATS_PN”:“%s:无效标识符”

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

【问题讨论】:

    标签: sql oracle plsql ref oodb


    【解决方案1】:

    我没有在功能上关注你正在做的事情,但我已经从你的对象中删除了 REF,因为它很难在 SQL 中处理。

    您会注意到t_studenti.pasnats_p,这是一个ats_pn 的表,其中包含一个id 和一个pasniedzeji:您必须构建整个层次结构。

    这段代码可以让你更新表格:

    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; 
    

    【讨论】:

    • 任务是使用 REF 和 DEREF:对象链接 (REF) M:M 在学生和讲师对象表之间创建数据库。一名学生与多名讲师联系在一起。一名讲师与多名学生联系在一起。因此有必要创建从学生到讲师以及从讲师到学生的双向对象链接。
    猜你喜欢
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多