SYS.ODCINUMBERLIST
est juste une liste où chaque enregistrement a un seul numéro. Vous devez utiliser un nouveau type d'enregistrement pour stocker les multiples champs dans chaque ligne.
Vous pouvez définir un type d'enregistrement à utiliser à la place de SYS.ODCINUMBERLIST
. Mais je serais enclin à déplacer le SELECT
déclaration comme étant un curseur explicite, afin que vous puissiez définir un nouveau type comme curseur %ROWTYPE
. De cette façon, votre type d'enregistrement et l'instruction select sont toujours cohérents, mais cela modifie un peu la structure de votre code.
Voici cette approche :
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;
Une remarque sur le BULK COLLECT
(à la fois ici et dans votre message d'origine) - les données que vous collectez en masse sont stockées dans la mémoire PGA. Donc, n'utilisez pas ce code tel quel s'il y a un changement, le nombre de nouveaux enregistrements sera déraisonnable (peut-être plus de quelques milliers).