ВСТАВКА ЗНАЧЕНИЙ В Вложенную таблицу - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь разработать университетскую базу данных с помощью вложенных таблиц, я успешно создал все остальные требуемые вложенные таблицы и вставленные данные, но при вставке данных в таблицу меток я сталкиваюсь с проблемой несогласованного типа данных.

коды:

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 ПОЛУЧИЛ MODULE_MARKS_T.

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

MM_NT_TYPE - это набор REF 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

0 голосов
/ 26 мая 2020

Мне эта структура кажется знакомой. Возможно, я создал такую ​​же структуру для одного из своих проектов.

Думаю, вы запутались, вставляя запись в столбец, имеющий тип, который является таблицей 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
    ))
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...