sql >> Databasteknik >  >> RDS >> Oracle

Alternativ till RETURNERING med INSERT...SELECT

Du använder insert into ... select from konstruera. Så potentiellt kommer ditt uttalande att infoga mer än en rad, vilket innebär att din RETURNING-sats kommer att returnera mer än en rad. Följaktligen måste du använda BULK COLLECT-syntaxen för att fylla i en samling av nya nycklar.

Så vi provar något sånt här ...

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

... bara för att få:

Det suger väl.

Tyvärr, medan RETURNING BULK COLLECT INTO fungerar med uppdateringar och borttagningar, fungerar det inte med infogningar (eller sammanslagningar kommer till det). Jag är säker på att det finns mycket goda skäl i den interna arkitekturen för Oracle-kärnan, men det här borde fungera, och att det inte gör det är mycket irriterande.

Hur som helst, som @PonderStibbons påpekade finns det en lösning:FORALL-konstruktionen.

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

Här är en LiveSQL-demo (gratis OTN-inloggning krävs) .




  1. När ett skript körs på SQLPlus skrivs det ut en sekvens av nummer istället för utdata

  2. MySQL binär vs char teckenuppsättning binär

  3. stöder rails postgres adapter ssl?

  4. Problem med att skapa MySQL-fråga i Symfony som innehåller JOIN och RAND()