0

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

4

1 回答 1

1

您不需要在这里使用游标(或集合,更实际地),甚至任何 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 演示,带有几行组成。

于 2020-02-21T12:59:45.013 回答