SYS.ODCINUMBERLIST
je pouze seznam, kde každý záznam má jedno číslo. Pro uložení více polí v každém řádku musíte použít nový typ záznamu.
Můžete definovat typ záznamu, který se použije místo SYS.ODCINUMBERLIST
. Ale byl bych nakloněn přesunout SELECT
příkaz být explicitní kurzor, takže můžete definovat nový typ jako kurzor %ROWTYPE
. Tímto způsobem jsou váš typ záznamu a příkaz select vždy konzistentní, ale trochu to mění strukturu vašeho kódu.
Zde je tento přístup:
DECLARE
CURSOR c_select IS
SELECT project_id, project_name
FROM
(
SELECT t1.project_id, t1.project_name FROM table_one t1
MINUS
SELECT t2.project_id, t2.project_name FROM table_two t2 );
TYPE l_missing_row_list_typ IS TABLE OF c_select%ROWTYPE;
l_missing_row_list l_missing_row_list_typ;
BEGIN
OPEN c_select;
FETCH c_select BULK COLLECT INTO l_missing_row_list;
CLOSE c_select;
FORALL i IN l_missing_row_list.FIRST..l_missing_row_list.LAST
INSERT INTO table_two VALUES ( l_missing_row_list(i).project_id, l_missing_row_list(i).project_name );
COMMIT;
-- Values are now inserted and you have the list of IDs in l_missing_row_list to add to your email.
END;
Jedna poznámka k BULK COLLECT
(jak zde, tak ve vašem původním příspěvku) -- data, která hromadně sbíráte, jsou uložena v paměti PGA. Takže nepoužívejte tento kód tak, jak je, pokud dojde ke změně, počet nových záznamů bude nepřiměřený (možná více než několik tisíc).