2010-07-15 17 views
6

में एकाधिक नेस्टेड टेबलों में एकाधिक रिकॉर्ड अपडेट करें मेरे पास कुछ कॉलम में नेस्टेड टेबल वाले ऑरैकल टेबल है। अब, मुझे मुख्य तालिका के प्रत्येक रिकॉर्ड में प्रत्येक नेस्टेड तालिका में सभी रिकॉर्ड्स अपडेट करने में सक्षम होना चाहिए। यह कैसे पूरा किया जाता है? मैंने कोशिश की है कि किसी भी तरीके से, मुझे उस दृश्य पर अपडेट करने में सक्षम नहीं होने के बारे में त्रुटियां मिलती हैं, या एकल पंक्ति सबक्वायरी एक से अधिक पंक्तियां लौटाती है।ऑरैकल

यहां उदाहरण के लिए एक उदाहरण दिया गया है। मैं इस तरह एक अद्यतन चला सकते हैं:

UPDATE TABLE(select entity.name 
       from entity 
       where entity.uidn = 2) 
    SET last = 'Decepticon', 
    change_date = SYSDATE, 
    change_user = USER 
    WHERE first = 'Galvatron'; 

लेकिन इस मामले में, टेबल खंड एक ही पंक्ति से एक भी नेस्टेड मेज पर निष्पादित किया जा रहा है। इस तरह का एक अद्यतन कैसे किया जाएगा यदि आप केवल entity.uidn नहीं चाहते थे जो 2 बराबर है?

धन्यवाद!

उत्तर

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> 

जैसा कि आप देख सकते हैं, नेस्टेड तालिका में प्रत्येक तत्व आईडी मामलों को सभी मामलों में शून्य पर सेट किया गया है। हम क्या करना चाहते हैं उन सभी को अद्यतन करें। लेकिन अफसोस!

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> 

लेकिन करने का एक ही रास्ता है कि पूरे तालिका के लिए एक है:

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> 

यह होल्डिंग तालिका में एक ही पंक्ति के लिए एक नेस्टेड मेज पर सभी तत्वों को अद्यतन करने के लिए संभव है पीएल/एसक्यूएल पाश। नीरस

एक विकल्प है: 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

वाह, धन्यवाद! क्या एक बहुत अच्छी तरह से rundown, मुझे आशा है कि यह दूसरों को एक ही समस्या के साथ मदद करता है। मैंने नेस्टेड टेबल के साथ कुछ मामलों में अधिक सहज होने के लिए काम किया है (विशेष रूप से जब ऑब्जेक्ट उन्मुख जावा एप्लिकेशन से आ रहा है), लेकिन दूसरों में थोड़ा बोझिल- – chrismarx

संबंधित मुद्दे