Как заполнить таблицу данными, которые содержат вложенную таблицу ссылок в Oracle? - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь создать базу данных конференции. Есть таблицы, такие как Авторы, Документы и таблица отношений. Таблица «Документы» содержит название исследования и вложенную таблицу ссылок на авторов (поскольку исследование может быть написано более чем одним человеком). Таблица авторов должна быть создана ссылочного типа? Я не могу понять, как вставить ссылки в эту вложенную таблицу. Есть идеи?

CREATE OR REPLACE TYPE AuthorType AS OBJECT (
name VARCHAR(30),
email VARCHAR(25),
institute VARCHAR(50)
)

CREATE OR REPLACE TYPE AuthorTable AS TABLE OF AuthorType;

CREATE TABLE Authors OF AuthorType;

CREATE OR REPLACE TYPE AuthorRefType AS TABLE OF REF AuthorType;

CREATE OR REPLACE TYPE PaperType AS OBJECT (
    title VARCHAR(150),
    language VARCHAR(2),
    section REF SectionType,
    authors AuthorRefType,
    MEMBER FUNCTION has_authors(authorName IN CHAR) RETURN INTEGER
)

CREATE TABLE PaperTable OF PaperType (
    FOREIGN KEY (section) REFERENCES SectionTable
)
NESTED TABLE authors STORE AS AuthorRefTable;

INSERT INTO PaperTable VALUES
    SELECT 'Services in the digital era: How the role of customers changes with the adoption of new technologies', 'EN', REF(section),
        AuthorRefType(
            (SELECT REF(a) FROM Authors a WHERE email = 'zs.kenesei@gmail.com'),
            (SELECT REF(a) FROM Authors a WHERE email = 's.seuring@gmail.com')),
FROM SectionTable section WHERE section = 'Marketing';

1 Ответ

0 голосов
/ 31 октября 2019

Если у вас есть авторы:

INSERT INTO Authors VALUES ( 'Alice',    'a@example.com', 'aaa' );
INSERT INTO Authors VALUES ( 'Beatrice', 'b@example.com', 'bbb' );
INSERT INTO Authors VALUES ( 'Carol',    'c@example.com', 'ccc' );

Затем вы можете заполнить PaperTable (почему суффикс таблицы?) Следующим образом:

INSERT INTO PaperTable (
  title,
  language,
  section,
  authors
) VALUES (
  'Paper 1',
  'XY',
  ( SELECT REF(s) FROM SectionTable s WHERE section = 'Fiction' ),
  AuthorRefType(
    ( SELECT REF(a) FROM Authors a WHERE name = 'Alice' ),
    ( SELECT REF(a) FROM Authors a WHERE name = 'Carol' )
  )
);

INSERT INTO PaperTable (
  title,
  language,
  section,
  authors
)
SELECT 'Paper 2',
       'YZ',
       REF(s),
       ( SELECT CAST(
                  COLLECT(
                    REF( a )
                  ) AS AuthorRefType
                )
         FROM   Authors a
         WHERE  name IN ( 'Beatrice', 'Carol' )
       )
FROM   SectionTable s
WHERE  section = 'Reference';

INSERT INTO PaperTable (
  title,
  language,
  section,
  authors
) VALUES (
  'Paper 3',
  'XZ',
  NULL,
  NULL
);

, а затем:

SELECT p.title,
       p.language,
       DEREF( p.section ).section AS section,
       DEREF( a.COLUMN_VALUE ).name AS name,
       DEREF( a.COLUMN_VALUE ).email AS email,
       DEREF( a.COLUMN_VALUE ).institute AS institute
FROM   PaperTable p
       LEFT OUTER JOIN TABLE( p.Authors ) a
       ON ( 1 = 1)

выходы:

TITLE   | LANGUAGE | SECTION   | NAME     | EMAIL         | INSTITUTE
:------ | :------- | :-------- | :------- | :------------ | :--------
Paper 1 | XY       | Fiction   | Alice    | a@example.com | aaa      
Paper 1 | XY       | Fiction   | Carol    | c@example.com | ccc      
Paper 2 | YZ       | Reference | Beatrice | b@example.com | bbb      
Paper 2 | YZ       | Reference | Carol    | c@example.com | ccc      
Paper 3 | XZ       | <em>null</em>      | <em>null</em>     | <em>null</em>          | <em>null</em>     

дБ <> скрипка здесь

...