Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Alternatywa dla POWROTU z INSERT...SELECT

Używasz insert into ... select from zbudować. Więc potencjalnie twoja instrukcja wstawi więcej niż jeden wiersz, co oznacza, że ​​twoja klauzula RETURNING zwróci więcej niż jeden wiersz. W związku z tym musisz użyć składni BULK COLLECT do wypełnienia kolekcji nowych kluczy.

Więc próbujemy czegoś takiego ...

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

... tylko po to, aby:

Cóż, to jest do bani.

Niestety, podczas gdy RETURNING BULK COLLECT INTO działa z aktualizacjami i usuwaniem, nie działa z wstawkami (lub do tego dochodzi scalanie). Jestem pewien, że istnieją bardzo dobre powody w wewnętrznej architekturze jądra Oracle, ale to powinno działać i że nie jest to najbardziej irytujące.

W każdym razie, jak zauważył @PonderStibbons, istnieje obejście:konstrukcja 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;
/

Oto demo LiveSQL (wymagane bezpłatne logowanie OTN) .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PRZYPADEK KIEDY WARUNEK PLSQL

  2. Jak zachować unikalny identyfikator wśród wielu tabel bazy danych?

  3. Wiosenna partia:nie można zwiększyć tożsamości; zagnieżdżony wyjątek to com.microsoft.sqlserver.jdbc.SQLServerException:nieprawidłowa nazwa obiektu „BATCH_JOB_SEQ”?

  4. Jeśli mamy zestaw znaków US7ASCII, dlaczego pozwala nam on przechowywać znaki spoza ASCII?

  5. Połącz i przetwarzaj dane Oracle z Objective-C w systemie Mac OS