【问题标题】:INSERTING VALUES INTO A NESTED TABLE将值插入嵌套表
【发布时间】:2020-05-26 14:52:15
【问题描述】:

我正在尝试借助嵌套表开发大学数据库,我已经成功创建了所有其他所需的嵌套表并插入了数据,但是在将数据插入标记表时,我面临数据类型不一致的问题。

代码:

CREATE OR REPLACE TYPE MODULE_MARKS;
CREATE OR REPLACE TYPE MM_NT_TYPE AS TABLE OF REF MODULE_MARKS;

CREATE OR REPLACE TYPE MODULE_MARKS AS OBJECT
(
  MODULE REF MODULE_T, MARKS_OBTAINED, TOTAL_MARKS, STATUS
)

CREATE TABLE MARK_TAB
(
  student ref student_t,
  modules_marks mm_nt_type
)

我能够正确插入对学生的引用,但我想将数据插入到 module_marks 中。

试过了:

INSERT INTO MARK_TAB VALUES((SELECT REF(S) FROM STUDENT_TAB S WHERE 
S.S_ID=1), 
MM_NT_TYPE( MODULE_MARKS_T((SELECT REF (M) FROM MODULE_TAB M WHERE 
M.MODULE_ID =1),
90,100,'PASS')));

这会导致错误 ORA-00932。 MODULE_MARKS_T 的预期引用 GOT MODULE_MARKS_T。

【问题讨论】:

  • student 和 modules_marks 的数据类型是什么。您从另一个对象中选择了数据类型,但实际的数据类型是什么。检查您用于插入的数据类型和现有数据类型

标签: sql oracle nested-table


【解决方案1】:

这对我来说似乎是一个熟悉的结构。也许我为我的一个项目创建了相同的结构。

我认为您在将记录插入到类型为 REF 表的列中时会感到困惑。

我有COURSES_TABLE_TYPE 这是REF COURSES_T 的表,课程表是COURSES_T 的表;

我建议您执行以下操作:

INSERT INTO DEPARTMENT VALUES (
    1,
    COURSES_TABLE_TYPE((  -- REFs of single records delimited by comma
        SELECT
            REF(C)
        FROM
            COURSE C
        WHERE
            COURSE_ID = 1
    ),(
        SELECT
            REF(C)
        FROM
            COURSE C
        WHERE
            COURSE_ID = 2
    ))
);

【讨论】:

    【解决方案2】:

    MM_NT_TYPEREF MODULE_MARKS 的集合,而您传递的是 MODULE_MARKS 对象而不是引用。相反,您需要有一个包含 MODULE_MARKS 对象的表,您可以引用这些对象:

    CREATE TABLE module_marks_tab OF module_marks;
    

    然后您可以引用这些对象。例如:

    INSERT INTO mark_tab VALUES (
      ( SELECT REF(s) FROM students s WHERE id = 2 ),
      MM_NT_TYPE(
        ( SELECT REF( m ) FROM module_marks_tab m WHERE m.module.id = 1 AND marks_obtained = 3 ),
        ( SELECT REF( m ) FROM module_marks_tab m WHERE m.module.id = 3 AND marks_obtained = 8 )
      )
    );
    

    db<>fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      相关资源
      最近更新 更多