gpt4 book ai didi

sql - 在oracle中更新多个嵌套表中的多个记录

转载 作者:行者123 更新时间:2023-12-04 14:06:45 25 4
gpt4 key购买 nike

我在某些列中有一个带有嵌套表的 oracle 表。现在,我需要能够更新主表的每个记录中每个嵌套表中的所有记录。这是如何实现的?我尝试过的任何一种方法,我都会收到关于无法在该 View 上执行更新或单行子查询返回多于一行的错误。

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

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

还有一个替代方案: 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;
^^^^^^^^^^^^^^^^

关于sql - 在oracle中更新多个嵌套表中的多个记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3256433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com