SYS.ODCINUMBERLIST
各レコードに単一の番号がある単なるリストです。各行に複数のフィールドを格納するには、新しいレコードタイプを使用する必要があります。
SYS.ODCINUMBERLIST
の代わりに使用するレコードタイプを定義できます。 。しかし、私はSELECT
を動かしたいと思います ステートメントを明示的なカーソルにすることで、新しいタイプをカーソル%ROWTYPE
として定義できます。 。そうすれば、レコードタイプとselectステートメントは常に一貫していますが、コードの構造が少し変わります。
そのアプローチは次のとおりです。
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;
BULK COLLECT
に関する1つのメモ (ここと元の投稿の両方)-一括収集しているデータはPGAメモリに保存されます。したがって、変更があった場合は、このコードをそのまま使用しないでください。新しいレコードの数は不合理になります(おそらく数千を超える)。