SYS.ODCINUMBERLIST
er blot en liste, hvor hver post har et enkelt nummer. Du skal bruge en ny posttype for at gemme de flere felter i hver række.
Du kan definere en posttype til brug i stedet for SYS.ODCINUMBERLIST
. Men jeg ville være tilbøjelig til at flytte SELECT
sætning til at være en eksplicit markør, så du kan definere en ny type som markør %ROWTYPE
. På den måde er din posttype og select-sætningen altid konsistente, men det ændrer strukturen på din kode en smule.
Her er den tilgang:
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;
En bemærkning om BULK COLLECT
(både her og i dit oprindelige indlæg) -- de data, du samler i bulk, er gemt i PGA-hukommelsen. Så brug ikke denne kode som den er, hvis der er en ændring, vil antallet af nye poster være urimeligt (måske mere end et par tusinde).