Вставка нескольких ссылок во вложенную таблицу

У меня есть таблица customer_table, содержащая список (вложенная таблица) ссылок на строки account_table.

Вот мои декларации:

Тип клиента:

CREATE TYPE customer as object(
    custid integer,
    infos ref type_person,
    accounts accounts_list
);

account_list тип:

CREATE TYPE accounts_list AS table of ref account;

Стол:

CREATE TABLE customer_table OF customer(
    custid primary key,
    constraint c_inf check(infos is not null),
    constraint c_acc check(accounts is not null)
)
NESTED TABLE accounts STORE AS accounts_refs_nt_table;

Поэтому я хотел бы вставить несколько ссылок в свою вложенную таблицу, когда я создаю клиента, так как учетную запись можно использовать совместно.

Я не могу узнать, как это сделать.

Я старался:

INSERT INTO customer_table(
    SELECT 0,
    ref(p),
    accounts_list(
        SELECT ref(a) FROM account_table a WHERE a.accid = 0
        UNION ALL 
        SELECT ref(a) FROM account_table a WHERE a.accid = 1
    )
    FROM DUAL
    FROM person_table p
    WHERE p.personid = 0
);

Без успеха.

Спасибо


person Guilhem Fry    schedule 21.03.2017    source источник


Ответы (1)


Вы можете использовать функцию collect(), например в подзапросе:

INSERT INTO customer_table(
    SELECT 0,
    ref(p),
    (
      SELECT CAST(COLLECT(ref(a)) AS accounts_list) 
      FROM account_table a
      WHERE accid IN (0, 1)
    )
    FROM person_table p
    WHERE p.personid = 0
);

Как сказано в документации: «Чтобы получить точные результаты от этой функции, вы должны использовать ее в функции CAST», поэтому я явно привел ее к вашему типу account_list.

Если вам не нужен подзапрос, вы можете вместо этого сделать:

INSERT INTO customer_table(
    SELECT 0,
    ref(p),
    CAST(COLLECT(a.r) AS accounts_list)
    FROM person_table p
    CROSS JOIN (SELECT ref(a) AS r FROM account_table a WHERE accid IN (0, 1)) a
    WHERE p.personid = 0
    GROUP BY ref(p)
);

но я думаю, что это немного грязнее; проверить работоспособность обоих...

person Alex Poole    schedule 21.03.2017