SYS.ODCINUMBERLIST
to tylko lista, na której każdy rekord ma jeden numer. Musisz użyć nowego typu rekordu, aby przechowywać wiele pól w każdym wierszu.
Możesz zdefiniować typ rekordu do użycia zamiast SYS.ODCINUMBERLIST
. Ale byłbym skłonny przenieść SELECT
instrukcja, aby była jawnym kursorem, dzięki czemu można zdefiniować nowy typ jako kursor %ROWTYPE
. W ten sposób typ rekordu i instrukcja select są zawsze spójne, ale zmienia nieco strukturę kodu.
Oto takie podejście:
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 uwaga na temat BULK COLLECT
(zarówno tutaj, jak i w oryginalnym poście) -- dane, które zbierasz zbiorczo, są przechowywane w pamięci PGA. Więc nie używaj tego kodu tak, jak jest, jeśli nastąpi zmiana, liczba nowych rekordów będzie nieuzasadniona (może więcej niż kilka tysięcy).