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

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

Вот мои заявления:

Тип клиента:

CREATE TYPE customer as object(
    custid integer,
    infos ref type_person,
    accounts accounts_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
);

Без успеха.

Спасибо

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)
);

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

Другие вопросы по тегам