Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ऑरैकल में एकाधिक नेस्टेड टेबल में एकाधिक रिकॉर्ड अपडेट करें

शायद डेटाबेस में नेस्टेड टेबल से बचने का सबसे अच्छा कारण यह है कि उनके साथ काम करना मुश्किल है, और सिंटैक्स अंडरडॉक्यूमेंटेड है और ग्रोक करना मुश्किल है।

आगे बढ़ रहा है!

यहां एक नेस्टेड टेबल वाली टेबल है।

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 ) 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>

लेकिन ऐसा करने का एक ही तरीका है वह पूरी तालिका के लिए एक पीएल/एसक्यूएल लूप है। हाँ!

एक विकल्प है:नेस्टेड टेबल का इस्तेमाल करें लोकेटर , NESTED_TABLE_GET_REFS संकेत के माध्यम से। यह विशेष रूप से अस्पष्ट चीज़ है (यह संकेतों की मुख्य सूची ) लेकिन यह चाल है:

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;
                                    ^^^^^^^^^^^^^^^^



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सी . के माध्यम से ओरेकल डीबी से जुड़ना

  2. sqlplus:साझा पुस्तकालयों को लोड करते समय त्रुटि:libsqlplus.so:साझा की गई वस्तु फ़ाइल नहीं खोल सकता:ऐसी कोई फ़ाइल या निर्देशिका नहीं

  3. ओरेकल एसक्यूएल में दोहरी से 10,000 अद्वितीय आईडी की सूची का चयन कैसे करें

  4. Ansible playbook के साथ Oracle SQL स्क्रिप्ट चलाना

  5. Oracle SQL क्वेरी फ़िल्टर JOIN ON बनाम WHERE में