sql >> Database >  >> RDS >> Oracle

Alternatief voor RETURNING met INSERT...SELECT

Je gebruikt de insert into ... select from bouwen. Dus mogelijk zal uw instructie meer dan één rij invoegen, wat betekent dat uw RETURNING-clausule meer dan één rij zal retourneren. Daarom moet u de BULK COLLECT-syntaxis gebruiken om een ​​verzameling te vullen van nieuwe sleutels.

Dus we proberen zoiets als dit ...

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

... alleen om te krijgen:

Nou dat is balen.

Helaas, terwijl RETURNING BULK COLLECT INTO werkt met updates en verwijderingen, werkt het niet met invoegingen (of daar komen samenvoegingen bij). Ik weet zeker dat er heel goede redenen zijn in de interne architectuur van de Oracle-kernel, maar dit zou moeten werken, en dat is het meest irritante.

Hoe dan ook, zoals @PonderStibbons aangaf, is er een oplossing:de FORALL-constructie.

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

Hier is een LiveSQL-demo (gratis OTN-aanmelding vereist) .




  1. Wat is de beste manier om batchgewijs records op te halen van SQL Server?

  2. MySQL-tekencodering gewijzigd. Wordt de gegevensintegriteit behouden?

  3. java.sql.SQLException:luisteraar weigerde de verbinding met de volgende fout:ORA-12519, TNS:geen geschikte service-handler gevonden

  4. Hoe MySQL datetime naar NSDate te converteren?