您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在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;
                                    ^^^^^^^^^^^^^^^^
Oracle 2022/1/1 18:50:54 有363人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶