2011-11-30 15 views
3

我們需要填充由20個不同表中的列組成的主表。在光標內部使用合併語句

我已經寫了一個存儲過程來連接一些返回最大列數並將它們放入遊標中的表。

現在。我使用for循環遍歷遊標記錄,以便我可以將它們插入到主表中。

如何在遊標中使用合併語句for循環,以便檢查是否需要更新現有行或插入新行,具體取決於記錄是否已存在或不存在。

任何想法,如果我們可以使用遊標內的合併語句for循環?任何例子?

回答

6

您可以通過從DUAL中選擇光標的數據來執行MERGE。例如

創建一個源和目標表中的一些數據

SQL> create table src (col1 number, col2 varchar2(10)); 

Table created. 

SQL> create table dest(col1 number, col2 varchar2(10)); 

Table created. 

SQL> insert into src values(1, 'A'); 

1 row created. 

SQL> insert into src values(2, 'B'); 

1 row created. 

SQL> insert into dest values(1, 'C'); 

1 row created. 

SQL> commit; 

Commit complete. 

運行合併

SQL> ed 
Wrote file afiedt.buf 

    1 begin 
    2 for x in (select * from src) 
    3 loop 
    4  merge into dest 
    5  using(select x.col1 col1, x.col2 col2 
    6    from dual) src 
    7   on(src.col1 = dest.col1) 
    8  when matched then 
    9   update set col2 = src.col2 
10  when not matched then 
11   insert(col1, col2) 
12   values(src.col1, src.col2); 
13 end loop; 
14* end; 
SQL>/

PL/SQL procedure successfully completed. 

,並驗證合併做了什麼,我們想要的。第1行已更新,第2行已插入。

SQL> select * from dest; 

     COL1 COL2 
---------- ---------- 
     1 A 
     2 B 

但是,通過這種方式構造代碼通常不會有太大意義。您通常最好將用於打開光標的查詢直接放入MERGE語句中,以便從DUAL中選擇一行數據,而不是從所有數據中選擇要合併的所有數據你正在嘗試合併數據的表格。當然,爲了保持MERGE語句的可讀性,可以爲MERGE語句查詢此查詢創建一個視圖。

+0

在for循環中,可以「(select * from src)」是一個遊標嗎? – jagamot

+0

@HonorGod - 不,它不能是遊標。它可以,也應該是用來打開遊標的查詢。 –