Det kanske bästa skälet till att undvika kapslade tabeller i en databas är att de är svåra att arbeta med, och syntaxen är underdokumenterad och svår att groka.
Går vidare!
Här är en tabell med en kapslad tabell.
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>
Som du kan se är ID-attributet noll i alla fall för varje element i den kapslade tabellen. Vad vi skulle vilja göra är att uppdatera dem alla. Men tyvärr!
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>
Det är möjligt att uppdatera alla element i en kapslad tabell för en enda rad i lagringstabellen:
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>
Men det enda sättet att göra det för hela tabellen är en PL/SQL-loop. Japp!
Det finns ett alternativ:använd en kapslad tabell Sökare , via NESTED_TABLE_GET_REFS-tipset. Detta är en särskilt obskyr sak (det finns inte i huvudlista med tips ) men det gör susen:
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>
Denna ledtråd gör att vi kan kringgå hålltabellen helt och hållet och arbeta med den faktiska kapslade tabellen. Det vill säga objektet som anges i lagringssatsen för kapslade tabeller:
create table transformer_forces (
force_name varchar2(10)
, force_members transformers_nt)
nested table force_members store as force_members_nt return as value;
^^^^^^^^^^^^^^^^