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

Thao tác bộ sưu tập

Ít nhất bạn đã mất một định nghĩa bảng trong trường hợp thứ hai. Tuyên bố này:

create or replace TYPE tbl_list2 IS OBJECT (l_owner  VARCHAR2(64),l_name  VARCHAR2(64));

chỉ khai báo kiểu đối tượng (hoặc bản ghi), không khai báo một bảng.

Vì vậy, bạn cần thực hiện theo 2 bước:

create or replace TYPE tbl_list_rec IS OBJECT (l_owner  VARCHAR2(64),l_name  VARCHAR2(64));
/

create or replace TYPE tbl_list2 as table of tbl_list_rec;
/

Sau đó, bạn cần sửa một số cú pháp trong script:

declare
  l_object tbl_list2;
  i        number;
begin
  -- for list initialization it must be filled with constructed objects
  l_object := tbl_list2( tbl_list_rec('','') );

  for i in 1..100000 loop          

    -- 1. select values to variable
    -- 2. Fix constructor for list 
    select 
      l_object MULTISET UNION DISTINCT tbl_list2(tbl_list_rec('myOwner','MyTable'))
    into 
      l_object 
    from 
      dual;

    end loop;

    for i in l_object.first ..  l_object.last loop
      -- output separate fields, there are now default conversion from 
      -- user-defined objects to varchar2.
      dbms_output.put_line(l_object(i).l_owner || ',' || l_object(i).l_name);
    end loop;  

end;
/

CẬP NHẬT

Giải pháp trên tương đối chậm vì số lượng lớn các công tắc ngữ cảnh. Tuy nhiên, việc so sánh các thể hiện kiểu đối tượng phức tạp không thể thực hiện trực tiếp trong PL / SQL mà không cần thực hiện thêm một số công việc khác.
Để cho phép Oracle biết các thể hiện đối tượng giống nhau hay khác nhau, chúng ta cần xác định phương pháp ánh xạ hoặc sắp xếp cho loại đối tượng . Cả hai loại phương pháp không được phép, vì vậy cần phải chọn một phương pháp thích hợp. Các phương pháp MAP hoạt động nhanh hơn và không cần đặt hàng trong trường hợp của chúng tôi, vì vậy hãy sử dụng nó:

create or replace TYPE tbl_list_rec2 AS OBJECT (
  l_owner  VARCHAR2(64),
  l_name  VARCHAR2(64),
  map member function get_key return varchar2
);
/

Thực hiện:

create or replace TYPE BODY tbl_list_rec2 AS 

  map member function get_key return varchar2
  is
  begin
    return l_owner||chr(1)||l_name;
  end;

end;
/

Sau đó, có thể kiểm tra các đối tượng về sự bình đẳng trong mã PL / SQL như varchar2 đơn giản trong ví dụ đầu tiên từ câu hỏi:

declare
  l_object tbl_list2a;
  i        number; 
begin
  l_object := tbl_list2a( tbl_list_rec2('','') );

  for i in 1..100000 loop          
    l_object := l_object MULTISET UNION DISTINCT tbl_list2a(tbl_list_rec2('myOwner','MyTable'));
  end loop;

  for i in l_object.first..  l_object.last loop
    dbms_output.put_line(l_object(i).l_owner || ',' || l_object(i).l_name);
  end loop;  

end;
/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trình tự Oracle cho trường khóa chính không truy xuất giá trị hiện được chèn trong Hibernate

  2. Một thủ tục được lưu trữ Oracle chấp nhận tham số mảng (bảng) trong ví dụ gói cần thiết

  3. cách gọi hàm oracle trong mybatis

  4. Làm thế nào để CHỌN Cột, * TỪ BẢNG trong Oracle?

  5. PL / SQL - Các điều kiện tùy chọn trong mệnh đề where - không có sql động?