避免在数据库中使用嵌套表的最佳原因可能是它们难以使用,并且语法文献不足,难以理解。
继续!
这是带有嵌套表的表。
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 MetroplexAutobot 0 Optimus PrimeAutobot 0 RodimusDecepticon 0 GalvatronDecepticon 0 MegatronDecepticon 0 StarscreamDinobot 0 GrimlockDinobot 0 SwoopDinobot 0 Snarl9 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 rowSQL>
可以为保持表中的单行更新嵌套表上的所有元素:
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 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 MetroplexAutobot 2 Optimus PrimeAutobot 3 RodimusDecepticon 4 GalvatronDecepticon 5 MegatronDecepticon 6 StarscreamDinobot 7 GrimlockDinobot 8 SwoopDinobot 9 Snarl9 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; ^^^^^^^^^^^^^^^^



