2016-12-12 29 views
1

我試圖從過程的表中插入數據,從下面的代碼它 一次插入一行,即使更多的行可從 我正在挑選數據的位置。請幫我修正這段代碼,所以 所有來自源頭的行都可以一次插入。 請確認是否需要更多說明。如何在存儲過程中使用多個遊標進行合併查詢?

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放在另一個遊標中。因此,如果有20個站點和5個precardsummaryid,則100個記錄應通過sendpkts

+0

哪裏'pktdate'從何而來?它沒有在你的代碼中聲明。 – APC

+0

請在第二個查詢中考慮它的系統日期,其中使用雙重處理 – ashish

+0

另外,EXIT WHEN語句應該緊跟相關的FETCH調用以防止異常或數據損壞。 – APC

回答

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; 

這並不總是有在存儲過程中提交一個好主意,但我已經離開這個在

+0

謝謝@apc它正在爲我的要求工作。 – ashish

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

+0

你確定嗎?根據我的經驗,流水線函數是開發人員發現非常酷的功能之一,但是在很少的用例中他們是最佳解決方案。也許你會在乎我的解決方案與我的基準? – APC

相關問題