SYS.ODCINUMBERLIST
chỉ là một danh sách mà mỗi bản ghi có một số duy nhất. Bạn cần sử dụng loại bản ghi mới để lưu trữ nhiều trường trong mỗi hàng.
Bạn có thể xác định loại bản ghi để sử dụng thay cho SYS.ODCINUMBERLIST
. Nhưng tôi có khuynh hướng di chuyển SELECT
là một con trỏ rõ ràng, để bạn có thể xác định một kiểu mới là con trỏ %ROWTYPE
. Bằng cách đó, loại bản ghi của bạn và câu lệnh select luôn nhất quán, nhưng nó sẽ thay đổi cấu trúc mã của bạn một chút.
Đây là cách tiếp cận đó:
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;
Một lưu ý về BULK COLLECT
(cả ở đây và trong bài đăng gốc của bạn) - dữ liệu bạn đang thu thập hàng loạt được lưu trữ trong bộ nhớ PGA. Vì vậy, không sử dụng mã này vì nếu có thay đổi số lượng bản ghi mới sẽ không hợp lý (có thể hơn vài nghìn).