我正在尝试从过程中的表中插入数据,从下面的代码中 即使有更多行可用,也一次插入一行 我正在挑选数据的位置。请帮我纠正这个代码 来自源的所有行可以一次插入。 请确认是否需要进一步澄清。
create or replace procedure proc_updatepkts
is
sitenotemp number(3);
precardtemp number(20);
cursor x1 is
select siteno
from sites;
cursor x2 is
select precardsummaryid
from precardsummary;
begin
open x1;
open x2;
loop
fetch x1 into sitenotemp;
fetch x2 into precardtemp;
merge into temptable a
using (sitenotemp as tosite
, precardtemp as recordid
, pktdate from dual) b
on (a.pktdate = b.pktdate)
when not matched then
insert (a.pktdate,a.tosite,a.recordid)
values(b.pktdate,b.tosite,b.recordid);
exit when x2%notfound;
exit when x1%notfound;
end loop;
close x2;
close x1;
commit;
end;
/
我正在尝试使用我在第一个游标中保存的值为所有网站发布相同的recordid
。如果有20个站点,那么20个记录应该发布相同的precardsummaryid
。现在扩展条件是可以有多个precardsummaryid
所以我已经在另一个游标中占用了所有precardsummaryid
。因此,如果在precardsummaryid
表
sendpkts
,那么100个记录应该通过
答案 0 :(得分:0)
您尚未定义源表中记录之间的任何关系。如果这是对您的要求的正确解释,您需要一个CROSS JOIN。
使用一组INSERT语句替换过程体中的所有代码:
create or replace procedure proc_updatepkts
is
begin
insert into sendpkts
(pktdate, tosite, recordid)
select sysdate as pktdate
, s.siteno as tosite
, p.precardsummaryid as recordid
from sites s
cross join precardsummary p;
commit;
end;
在存储过程中提交提交并不总是一个好主意,但我已经把这个提交了。
答案 1 :(得分:0)
是否有必要使用程序?您最好使用流水线功能一次合并所有行。
链接在哪里 https://docs.oracle.com/cd/B28359_01/appdev.111/b28425/pipe_paral_tbl.htm
并使用批量收集存储整个光标进行合并 http://www.oracle.com/technetwork/issue-archive/2008/08-mar/o28plsql-095155.html