【问题标题】:update multiple records in multiple nested tables in oracle在oracle中更新多个嵌套表中的多条记录
【发布时间】:2011-03-16 10:43:36
【问题描述】:

我有一个 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 oracle sql-update nested-table


    【解决方案1】:

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

    继续!

    这是一个带有嵌套表的表。

    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 循环。呸!

    还有一个替代方案:use a Nested Table Locator,通过 NESTED_TABLE_GET_REFS 提示。这是一件特别晦涩的事情(它不在main list of hints 中),但它可以解决问题:

    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 应用程序时),但在其他情况下有点麻烦-
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    相关资源
    最近更新 更多