2010-07-15 116 views
6

我在某些列中有一個帶有嵌套表的oracle表。現在,我需要能夠在主表的每個記錄中更新每個嵌套表中的所有記錄。這是如何完成的?我嘗試過的任何方式都會導致無法在該視圖上執行更新或者單行子查詢返回多行的錯誤。更新oracle中多個嵌套表中的多條記錄

這裏是一個例子來說明。我可以像這樣運行一個更新:

​​

但是在這種情況下,table子句從一行中的單個嵌套表上執行。如果你不想只有等於2的entity.uidn,那麼如何執行這樣的更新?

謝謝!

回答

10

也許避免在數據庫中嵌套表的最好的原因是它們很難處理,而且語法沒有記錄並且很難理解。

繼續前進!

下面是一張嵌套表格。

SQL> select f.force_name, t.id, t.name 
    2 from transformer_forces f, table(f.force_members) t 
    3/

FORCE_NAME   ID NAME 
---------- ---------- -------------------- 
Autobot    0 Metroplex 
Autobot    0 Optimus Prime 
Autobot    0 Rodimus 
Decepticon   0 Galvatron 
Decepticon   0 Megatron 
Decepticon   0 Starscream 
Dinobot    0 Grimlock 
Dinobot    0 Swoop 
Dinobot    0 Snarl 

9 rows selected. 

SQL> 

如您所見,嵌套表中的每個元素的ID屬性在所有情況下均設置爲零。我們想要做的是更新所有這些。可惜!

SQL> update table 
    2 (select force_members from transformer_forces) t 
    3 set t.id = rownum 
    4/
(select force_members from transformer_forces) t 
    * 
ERROR at line 2: 
ORA-01427: single-row subquery returns more than one row 


SQL> 

是可能的更新嵌套表中的所有元素單個行保持表:

SQL> update table 
    2  (select force_members from transformer_forces 
    3   where force_name = 'Autobot') t 
    4  set t.id = rownum 
    5/

3 rows updated. 

SQL> 

但這樣做的唯一途徑整個表是一個PL/SQL循環。呸!

有一個替代方案:use a Nested Table Locator,通過NESTED_TABLE_GET_REFS提示。這是一個特別不起眼的東西(它不是在main list of hints),但它的伎倆:

SQL> update /*+ NESTED_TABLE_GET_REFS */ force_members_nt 
    2 set id = rownum 
    3/

9 rows updated. 

SQL> select f.force_name, t.id, t.name 
    2 from transformer_forces f, table(f.force_members) t 
    3/

FORCE_NAME   ID NAME 
---------- ---------- -------------------- 
Autobot    1 Metroplex 
Autobot    2 Optimus Prime 
Autobot    3 Rodimus 
Decepticon   4 Galvatron 
Decepticon   5 Megatron 
Decepticon   6 Starscream 
Dinobot    7 Grimlock 
Dinobot    8 Swoop 
Dinobot    9 Snarl 

9 rows selected. 

SQL> 

這個提示可以讓我們完全繞過保持工作臺,並與實際嵌套表工作。也就是說,在嵌套表存儲子句中指定的對象:

create table transformer_forces (
    force_name varchar2(10) 
    , force_members transformers_nt) 
nested table force_members store as force_members_nt return as value; 
            ^^^^^^^^^^^^^^^^ 
+0

哇,謝謝!多麼徹底的破壞,我希望這可以幫助其他人解決同樣的問題。我發現在某些情況下(尤其是來自面向對象的Java應用程序時),嵌套表的工作更直觀,但在其他情況下有點麻煩 - – chrismarx 2010-07-15 19:53:27