Oracle
 sql >> база данни >  >> RDS >> Oracle

актуализирайте множество записи в множество вложени таблици в 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>

Както можете да видите, за всеки елемент във вложената таблица атрибутът ID е зададен на нула във всички случаи. Това, което бихме искали да направим, е да актуализираме всички тях. Но, уви!

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>

Но единственият начин да направите това за цялата таблица е PL/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. Oracle Forms 6i се срива с 0xC0000005 при стартиране след инсталиране на корекция 19

  3. Рамка за синхронизиране:Oracle/SQLServer

  4. Пролетна поддръжка на JDBC и голям набор от данни

  5. CURRENT_TIMESTAMP() Функция в Oracle