Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Thay thế để QUAY LẠI bằng CHÈN ... CHỌN

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í) .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cấu trúc cây trong sql trong Oracle. Cách hiển thị cây, nút con và nút cha trong SQL Oracle

  2. Cài đặt Oracle 11g Release 2 Enterprise Edition trên Windows 7 32-Bit

  3. Oracle tương đương với chức năng STUFF của SQL Server?

  4. UID - Trả lại ID của Phiên hiện tại trong Oracle

  5. Tìm kiếm Văn bản trong Quy trình Lưu trữ Oracle