sql >> Databasteknik >  >> RDS >> Oracle

uppdatera flera poster i flera kapslade tabeller i Oracle

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



  1. Använder MYsql 5.6 Memcache

  2. $filter fungerar inte i JPA/Olingo 2.0.11 med MySQL

  3. Hur infogas multidimensionella arrayer i en MySQL-tabell?

  4. MySQL-gränsintervall