Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Alternatif untuk KEMBALI dengan INSERT...SELECT

Anda menggunakan insert into ... select from membangun. Jadi berpotensi pernyataan Anda akan memasukkan lebih dari satu baris, yang berarti klausa RETURNING Anda akan mengembalikan lebih dari satu baris. Akibatnya, Anda perlu menggunakan sintaks BULK COLLECT untuk mengisi koleksi kunci baru.

Jadi kami mencoba sesuatu seperti ini ...

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;
/

... hanya untuk mendapatkan:

Yah itu menyebalkan.

Sayangnya, sementara RETURNING BULK COLLECT INTO berfungsi dengan pembaruan dan penghapusan, itu tidak berfungsi dengan sisipan (atau penggabungan terjadi). Saya yakin ada alasan yang sangat masuk akal dalam arsitektur internal kernel Oracle tetapi ini seharusnya berhasil, dan itu tidak terlalu mengganggu.

Bagaimanapun, seperti yang ditunjukkan oleh @PonderStibbons ada solusi:konstruksi 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;
/

Ini demo LiveSQL (diperlukan login OTN gratis) .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-01950:tidak ada hak istimewa pada tablespace 'USERS'

  2. Oracle setara dengan SQL Server DATEPART

  3. Bagaimana cara memasukkan karakter baris baru di Oracle?

  4. Perbarui kolom tabel Oracle dengan nomor baris

  5. Oracle membaca nama kolom dari pernyataan pilih