如何在存储过程中使用多个游标进行合并查询?

时间:2016-12-12 06:39:36

标签: oracle stored-procedures plsql merge cursor

我正在尝试从过程中的表中插入数据,从下面的代码中 即使有更多行可用,也一次插入一行 我正在挑选数据的位置。请帮我纠正这个代码 来自源的所有行可以一次插入。 请确认是否需要进一步澄清。

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

中有20个站点和5个sendpkts,那么100个记录应该通过

2 个答案:

答案 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