Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

cập nhật nhiều bản ghi trong nhiều bảng lồng nhau trong oracle

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;
                                    ^^^^^^^^^^^^^^^^



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đếm số phần tử trong một chuỗi được phân tách bằng dấu phẩy trong Oracle

  2. Làm cách nào để đếm số lần xuất hiện của một ký tự trong giá trị Oracle varchar?

  3. Chuyển đổi LONG sang varchar trong Oracle

  4. ODP.NET Oracle.ManagedDataAccess khiến phiên mạng ORA-12537 kết thúc tệp

  5. Tìm kiếm tên trong cx_Oracle