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