Sql 在oracle中更新多个嵌套表中的多条记录

Sql 在oracle中更新多个嵌套表中的多条记录,sql,oracle,sql-update,nested-table,Sql,Oracle,Sql Update,Nested Table,我有一个oracle表,其中一些列中有嵌套的表。现在,我需要能够更新每个嵌套表中的所有记录,在主表的每个记录中。这是如何实现的?我尝试过的任何一种方法都会出现错误,要么无法对该视图执行更新,要么单行子查询返回多行 这里有一个例子来说明。我可以运行如下更新: UPDATE TABLE(select entity.name from entity where entity.uidn = 2) SET last = '

我有一个oracle表,其中一些列中有嵌套的表。现在,我需要能够更新每个嵌套表中的所有记录,在主表的每个记录中。这是如何实现的?我尝试过的任何一种方法都会出现错误,要么无法对该视图执行更新,要么单行子查询返回多行

这里有一个例子来说明。我可以运行如下更新:

    UPDATE TABLE(select entity.name
                 from entity
                 where entity.uidn = 2)
    SET last = 'Decepticon',
    change_date = SYSDATE,
    change_user = USER
    WHERE first = 'Galvatron';
但在本例中,table子句是在一行中的一个嵌套表上执行的。如果您不只是想要等于2的entity.uidn,那么如何执行这样的更新


谢谢

避免在数据库中使用嵌套表的最佳原因可能是它们很难使用,而且语法文档不足,很难理解

继续

这是一个带有嵌套表的表

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循环。恶心

还有一种替代方法:,通过嵌套的_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;
                                    ^^^^^^^^^^^^^^^^

哇,谢谢!这是一个非常彻底的总结,我希望这能帮助其他有同样问题的人。我发现在某些情况下使用嵌套表更直观(尤其是来自面向对象的java应用程序时),但在其他情况下有点麻烦-