Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

perbarui banyak catatan di beberapa tabel bersarang di Oracle

Mungkin alasan terbaik untuk menghindari tabel bersarang dalam database adalah karena tabel tersebut sulit untuk dikerjakan, dan sintaksnya kurang terdokumentasi dan sulit untuk di-grok.

Lanjutkan!

Berikut adalah tabel dengan tabel bersarang.

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>

Seperti yang Anda lihat, setiap elemen dalam tabel bersarang, atribut ID disetel ke nol dalam semua kasus. Yang ingin kami lakukan adalah memperbarui semuanya. Tapi, sayangnya!

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> 

Dimungkinkan untuk memperbarui semua elemen pada tabel bersarang untuk satu baris di tabel penahan:

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>

Tapi satu-satunya cara untuk melakukan itu untuk seluruh tabel adalah PL/SQL loop. Astaga!

Ada alternatif:gunakan Tabel Bersarang Pencari Lokasi , melalui petunjuk NESTED_TABLE_GET_REFS. Ini adalah hal yang sangat tidak jelas (tidak ada di daftar petunjuk utama ) tetapi berhasil:

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>

Petunjuk ini memungkinkan kita untuk melewati tabel holding sama sekali dan bekerja dengan tabel bersarang yang sebenarnya. Yaitu, objek yang ditentukan dalam klausa penyimpanan Tabel Bersarang:

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. Ubah nilai yang dipisahkan koma menjadi baris di Oracle

  2. Apakah ora_hash deterministik?

  3. ORA-04091:tabel xx_xx bermutasi, pemicu/fungsi mungkin tidak melihatnya

  4. Gabung eliminasi tidak berfungsi di Oracle dengan sub kueri

  5. SQL*Plus CSV Ekspor lebih lambat dari SQL Developer