sql >> Databáze >  >> RDS >> Oracle

Alternativa k RETURNING s INSERT...SELECT

Používáte insert into ... select from postavit. Váš příkaz tedy potenciálně vloží více než jeden řádek, což znamená, že vaše klauzule RETURNING vrátí více než jeden řádek. V důsledku toho musíte použít syntaxi BULK COLLECT k naplnění kolekce nových klíčů.

Takže zkusíme něco takového ...

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

... pouze získat:

No to je na hovno.

Bohužel, zatímco RETURNING BULK COLLECT DO pracuje s aktualizacemi a mazáním, nefunguje s vkládáním (nebo k tomu dochází sloučením). Jsem si jistý, že v interní architektuře jádra Oracle existují velmi rozumné důvody, ale toto by mělo fungovat, a že ne, je velmi nepříjemné.

Každopádně, jak poznamenal @PonderStibbons, existuje řešení:konstrukce 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;
/

Zde je ukážka LiveSQL (vyžaduje bezplatné přihlášení OTN) .




  1. sql, pokud je v příkazu insert bez select

  2. Tučný text v SSRS

  3. Co bych si měl vybrat - JSON nebo SQLite?

  4. jak obrátit řazení dat mysql