SYS.ODCINUMBERLIST
é apenas uma lista onde cada registro tem um único número. Você precisa usar um novo tipo de registro para armazenar os vários campos em cada linha. Você pode definir um tipo de registro para usar no lugar de
SYS.ODCINUMBERLIST
. Mas eu estaria inclinado a mover o SELECT
declaração para ser um cursor explícito, para que você possa definir um novo tipo como cursor %ROWTYPE
. Dessa forma, seu tipo de registro e a instrução select são sempre consistentes, mas alteram um pouco a estrutura do seu código. Aqui está essa abordagem:
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;
Uma observação sobre o
BULK COLLECT
(tanto aqui quanto em seu post original) -- os dados que você está coletando em massa são armazenados na memória PGA. Portanto, não use este código como está, se houver uma alteração, o número de novos registros não será razoável (talvez mais do que alguns milhares).