Как вставить набор результатов нескольких курсоров в одну таблицу - PullRequest
0 голосов
/ 21 февраля 2020

1 таблица, имеющая структуру таблицы -

 create table tab_abc
 ( id        varchar2(10),
   inv_bfr   varchar2(20),
   desc      varchar2(10),
   inv_afr   varchar2(10)  );

Я определил 2 курсора здесь как C1 & C2 ->

 cursor C1 is select id, count(inv) AS "inv_bfr", desc from tab_a group by id, desc;

 cursor C2 is select count(inv) AS "inv_afr" from tab_a;

Результирующий набор обоих курсоров C1 & C2 вставит в таблицу tab_abc. Курсор C1 откроется до выполнения одной операции DML, а курсор C2 откроется после выполнения операции DML. Не могли бы вы помочь мне, могу ли я использовать OPEN CURSOR THEN FETCH процесс будет хорошо или FOR CURSOR LOOP INSERT INTO TABLE процесс.

1 Ответ

1 голос
/ 21 февраля 2020

Вам не нужно использовать курсоры (или коллекции, более реалистично) или даже любой PL / SQL здесь. Вы можете вставить данные в таблицу перед вашим шагом «Выполнение DML», а затем обновить, если впоследствии, например, с помощью слияния:

-- initial population
insert into tab_abc (id, inv_bfr, descr, inv_afr)
select id, count(*) as inv_bfr, descr, 0 as inv_after
from tab_a
group by id, descr;

-- intermediate DML operation

-- post-DML update
merge into tab_abc t
using (
  select id, 0 as inv_bfr, descr, count(*) as inv_afr
  from tab_a
  group by id, descr
) afr
on (afr.id = t.id and afr.descr = t.descr)
when matched then
  update set inv_afr = afr.inv_afr
when not matched then
  insert (id, inv_bfr, descr, inv_afr)
  values (afr.id, afr.inv_bfr, afr.descr, afr.inv_afr);

Все это можно обернуть в блок PL / SQL конечно, если вам нужно по другим причинам.

db <> fiddle demo с несколькими вымышленными строками.

...