如何在存储过程中使用多个游标进行合并查询?
How to use multiple cursor in stored procedure for merge query?
我正在尝试在 table 过程中插入数据,从下面的代码中
一次插入一行,即使有更多行可用
我选择数据的位置。请帮助我更正此代码
来自源的所有行都可以一次插入。
请确认是否需要进一步说明。
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;
/
我正在尝试 post 对所有具有我在第一个游标中持有的值的站点进行相同 recordid
。如果有 20 个站点,那么 20 个记录应该 post 相同 precardsummaryid
。现在扩展条件是可以有多个 precardsummaryid
所以我把所有 precardsummaryid
放在另一个游标中。因此,如果有 20 个站点和 5 个 precardsummaryid
,那么 100 条记录应该传入 sendpkts
table
您尚未定义源表中记录之间的任何关系。如果这是对您的要求的正确解释,您需要一个 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;
在存储过程中进行提交并不总是一个好主意,但我保留了这个。
有必要使用程序吗?您最好使用流水线函数一次合并所有行。
哪里 link
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
我正在尝试在 table 过程中插入数据,从下面的代码中 一次插入一行,即使有更多行可用 我选择数据的位置。请帮助我更正此代码 来自源的所有行都可以一次插入。 请确认是否需要进一步说明。
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;
/
我正在尝试 post 对所有具有我在第一个游标中持有的值的站点进行相同 recordid
。如果有 20 个站点,那么 20 个记录应该 post 相同 precardsummaryid
。现在扩展条件是可以有多个 precardsummaryid
所以我把所有 precardsummaryid
放在另一个游标中。因此,如果有 20 个站点和 5 个 precardsummaryid
,那么 100 条记录应该传入 sendpkts
table
您尚未定义源表中记录之间的任何关系。如果这是对您的要求的正确解释,您需要一个 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;
在存储过程中进行提交并不总是一个好主意,但我保留了这个。
有必要使用程序吗?您最好使用流水线函数一次合并所有行。
哪里 link 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