当前位置: 首页 > 面试题库 >

在Oracle中的多个嵌套表中更新多个记录

严天逸
2023-03-14
问题内容

我在某些列中有一个带有嵌套表的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循环。!

还有一种选择:通过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;
                                    ^^^^^^^^^^^^^^^^


 类似资料:
  • 问题内容: 我有2张桌子,如下所示: serial_table serial_key CHARACTER VARYING(20), PRIMARY KEY(id, serial_key) serial_rate: serial_key CHARACTER VARYING(20), rate NUMERIC, PRIMARY KEY(id, serial_key), FOREIGN KEY (id,

  • 我知道以前有人问过这个问题,我已经阅读了很多答案,现在正在研究其中一个答案,但是我需要以下代码的帮助。 我在执行时没有收到任何错误,也没有任何内容提交到mysql表,如果你发现了什么,请告诉我,或者如果有更好的方法,请你给我指一个教程,我还没有太多的PDO或多行更新。 提前谢谢。 致山姆: 产出为:

  • 我在PostgreSQL上有一个Django JSONField,它包含一个字典,我想使用queryset。update()以使用值批量更新多个键。我知道如何对JSONField中的一个值(以及通常的多个字段)执行此操作: 这似乎有效 - 根据我的另一个问题有一些差距 - 就像这样: 但是如果我现在想在同一个中更新第二个,我显然不能像这样两次使用参数: 有办法做到这一点吗?

  • 问题内容: 我知道您可以一次插入多行,是否可以在MySQL中一次更新多行(如在一个查询中)? 编辑:例如,我有以下内容 我想将以下所有更新合并到一个查询中 问题答案: 是的,这是可能的-您可以在插入的键更新中使用INSERT…。 使用您的示例:

  • 我有多个json文件,其中包含需要合并的关系数据,每个文件都有一个带有commonkey的记录,这是所有文件中的公共键,在下面的示例中,a0,a1是公共键。值是多个键的嵌套字典,如Key1、key2等,如下所示,我需要合并多个json文件并获得如dboutput.json所示的输出,文件名在合并操作中充当索引。这样的问题是一个相关的问题,它合并了丢失的信息,但在我的情况下,我不希望任何更新替换现有

  • 问题内容: 如何在MySQL中更新多个值? 这不起作用: 问题答案: 您需要在两个不同的值之间添加一个逗号。例如: