oracle 嵌套表查询语句,sql – 在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循环.呸!

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

^^^^^^^^^^^^^^^^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值