Oracle
 sql >> база данни >  >> RDS >> Oracle

Алтернатива на RETURNING с INSERT...SELECT

Използвате insert into ... select from конструирам. Така че потенциално вашият оператор ще вмъкне повече от един ред, което означава, че вашата клауза RETURNING ще върне повече от един ред. Следователно трябва да използвате синтаксиса BULK COLLECT, за да попълните колекция на нови ключове.

Така че опитваме нещо подобно...

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

... само за да получите:

Е, това е гадно.

За съжаление, докато RETURNING BULK COLLECT INTO работи с актуализации и изтривания, той не работи с вмъквания (или сливания стигат до това). Сигурен съм, че има много основателни причини във вътрешната архитектура на ядрото на Oracle, но това трябва да работи, а това, че не работи, е най-досадно.

Както и да е, както посочи @PonderStibbons, има заобиколно решение:конструкцията 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;
/

Ето демонстрация на LiveSQL (изисква се безплатно влизане в 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. Необходимо е да се намери средно време за обработка между всички записи за времеви отпечатъци в Oracle SQL

  2. Има ли метод в PL/SQL за конвертиране/кодиране на текст в XML съвместим текст?

  3. Възможно ли е да управлявате база данни на oracle с flyway?

  4. Автоматично налагане на максимален размер на таблицата на базата данни чрез премахване на стари редове

  5. Какви са ролите и привилегиите, които да дадете на потребител, за да изпълнява CRUD (на Oracle 12)