SYS.ODCINUMBERLIST
is slechts een lijst waarbij elke record een enkel nummer heeft. U moet een nieuw recordtype gebruiken om de meerdere velden in elke rij op te slaan.
U kunt een recordtype definiëren om te gebruiken in plaats van SYS.ODCINUMBERLIST
. Maar ik zou geneigd zijn om de SELECT
statement om een expliciete cursor te zijn, zodat u een nieuw type kunt definiëren als cursor %ROWTYPE
. Op die manier zijn uw recordtype en de select-instructie altijd consistent, maar het verandert de structuur van uw code een beetje.
Dit is die benadering:
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;
Een opmerking over de BULK COLLECT
(zowel hier als in uw oorspronkelijke bericht) -- de gegevens die u in bulk verzamelt, worden opgeslagen in PGA-geheugen. Gebruik deze code dus niet, want als er een wijziging is, zal het aantal nieuwe records onredelijk zijn (misschien meer dan een paar duizend).