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

Bộ sưu tập Oracle trong mệnh đề where

Bạn không thể sử dụng tập hợp được khai báo cục bộ trong mệnh đề SQL:

declare
    type i_name is table of nvarchar2(512);
    i_itemname i_name := i_name();
    c number;
begin
    select distinct owner bulk collect into i_itemname from all_objects;
    dbms_output.put_line(i_itemname.count);
    select count(*) into c
    from all_tables
    where owner in (select * from table(i_itemname));
    dbms_output.put_line(c);
end;
/

    where owner in (select * from table(i_itemname));
                                        *
ERROR at line 10:
ORA-06550: line 10, column 41:
PLS-00642: local collection types not allowed in SQL statements
ORA-06550: line 10, column 35:
PL/SQL: ORA-22905: cannot access rows from a non-nested table item
ORA-06550: line 8, column 5:
PL/SQL: SQL Statement ignored

Nhưng bạn có thể nếu nó được khai báo ở cấp giản đồ, về cơ bản để SQL biết về kiểu, không chỉ PL / SQL:

create type i_name is table of nvarchar2(512);
/

Type created.

declare
    i_itemname i_name := i_name();      
    c number;
begin 
    select distinct owner bulk collect into i_itemname from all_objects;
    dbms_output.put_line(i_itemname.count);
    select count(*) into c from all_tables
    where owner in (select * from table(i_itemname));
    dbms_output.put_line(c);
end;
/

No errors.
18
128

PL/SQL procedure successfully completed.

Bạn cũng có thể tham gia table xây dựng thay vì sử dụng truy vấn con:

...
    select count(*) into c
    from table(i_itemname) t
    join all_tables at on at.owner = t.column_value;
...

Tuy nhiên, tôi không rõ bạn là đồng gì. (Nếu bạn không sử dụng bộ sưu tập cho bất kỳ điều gì khác, tốt hơn là bạn chỉ nên kết hợp dữ liệu thô, nhưng tôi cho rằng bộ sưu tập ở đó là có lý do).

Như @haki đã đề cập trong nhận xét, bạn cũng có thể làm:

...
    select count(*) into c
    from all_tables
    where owner member of (i_itemname);
...

... miễn là i_name và cột bạn đang so sánh với giống nhau gõ . Trong ví dụ của tôi, nó không tìm thấy hàng nào vì tôi đang cố so sánh nvarchar2 với varchar2 , nhưng sẽ tìm thấy một kết quả phù hợp nếu được xác định lại i_name dưới dạng varchar2(512) . Trong trường hợp của bạn, có lẽ là tab.colnvarchar2 dù sao đi nữa.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách sao lưu máy ảo RAC

  2. Cách đọc tất cả các tệp của Thư mục Oracle với PL / SQL và cập nhật cột BLOB

  3. Có phương pháp nào trong PL / SQL để chuyển đổi / mã hóa văn bản sang văn bản tuân thủ XML không?

  4. Oracle cùng một tên bảng trên các lược đồ khác nhau?

  5. Tham gia bên ngoài Oracle không hoạt động như mong đợi