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

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