Bạn đang sử dụng insert into ... select from
xây dựng. Vì vậy, có khả năng câu lệnh của bạn sẽ chèn nhiều hơn một hàng, có nghĩa là mệnh đề RETURNING của bạn sẽ trả về nhiều hơn một hàng. Do đó, bạn cần sử dụng cú pháp BULK COLLECT để điền một bộ sưu tập khóa mới.
Vì vậy, chúng tôi thử một cái gì đó như thế này ...
declare
/* NB: define this collection using the appropriate name */
type new_keys is table of table_xxx.cola%type;
col_res new_keys;
begin
INSERT INTO TBL_XXX
SELECT COLA * 10, COLB, COLC FROM TBL_YYY
RETURNING table_xxx.COLA bulk collect INTO COL_RES;
end;
/
... chỉ để nhận:
Chà, tệ quá.
Thật không may, trong khi QUAY LẠI BỘ SƯU TẬP SỐ LƯỢNG LỚN VÀO hoạt động với các bản cập nhật và việc xóa nó không hoạt động với các phần chèn (hoặc hợp nhất đi kèm với điều đó). Tôi chắc rằng có những lý do rất hợp lý trong kiến trúc bên trong của nhân Oracle nhưng điều này nên hoạt động và nó không gây khó chịu nhất.
Dù sao, như @PonderStibbons đã chỉ ra rằng có một cách giải quyết:cấu trúc FORALL.
declare
type new_rows is table of tbl_xxx%rowtype;
rec_xxx new_rows;
type new_keys is table of tbl_xxx.cola%type;
col_xxx new_keys;
begin
select cola * 10, colb, colc
bulk collect into rec_xxx
from tbl_yyy;
forall idx in 1 .. rec_xxx.count()
insert into tbl_xxx
values rec_xxx(idx)
returning tbl_xxx.cola bulk collect into col_xxx
;
for idx in 1 .. rec_xxx.count() loop
dbms_output.put_line('tbl_xxx.cola = ' || col_xxx(idx));
end loop;
end;
/
Đây là bản demo LiveSQL (yêu cầu đăng nhập OTN miễn phí) .