Có lẽ lý do tốt nhất để tránh các bảng lồng nhau trong cơ sở dữ liệu là chúng khó làm việc và cú pháp không có tài liệu và khó tìm hiểu.
Tiếp tục!
Đây là một bảng với một bảng lồng nhau.
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>
Như bạn có thể thấy, mỗi phần tử trong bảng lồng nhau thuộc tính ID được đặt thành 0 trong mọi trường hợp. Những gì chúng tôi muốn làm là cập nhật tất cả chúng. Nhưng, than ôi!
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>
Có thể cập nhật tất cả các phần tử trên bảng lồng nhau cho một hàng trong bảng giữ:
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>
Nhưng cách duy nhất để làm điều đó cho toàn bộ bảng là một vòng lặp PL / SQL. Thật tuyệt!
Có một giải pháp thay thế: sử dụng Bảng lồng nhau Bộ định vị , thông qua gợi ý NESTED_TABLE_GET_REFS. Đây là một điều đặc biệt khó hiểu (nó không có trong danh sách gợi ý chính ) nhưng nó thực hiện thủ thuật:
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>
Gợi ý này cho phép chúng ta bỏ qua hoàn toàn bảng giữ và làm việc với bảng lồng nhau thực tế. Đó là, đối tượng được chỉ định trong mệnh đề lưu trữ Bảng lồng nhau:
create table transformer_forces (
force_name varchar2(10)
, force_members transformers_nt)
nested table force_members store as force_members_nt return as value;
^^^^^^^^^^^^^^^^