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

Sử dụng cấu trúc dữ liệu nào để sắp xếp dữ liệu này trong PL / SQL?

Sẽ rất dễ dàng nếu bạn sử dụng PL / SQL như SQL và không giống như các ngôn ngữ khác. Nó khá cụ thể và đôi khi rất hay vì điều đó.

Đôi khi tôi thực sự ghét PL / SQL, nhưng trường hợp này là hoàn toàn về tình yêu.

Xem nó dễ dàng như thế nào:

create type it as object (
  iter          number,
  stringval     varchar2(100),
  intval        integer
);

create type t_it as table of it;

declare
  t       t_it := new t_it();
  tmp1    varchar2(32767);
  tmp2    varchar2(32767);
begin
  t.extend(4);
  t(1) := new it(1,'Oslo',40);
  t(2) := new it(2,'Berlin',74);
  t(3) := new it(3,'Rome',25);
  t(4) := new it(4,'Paris',10);

  select listagg(stringval,', ') within group (order by stringval),
         listagg(stringval,', ') within group (order by intval)
  into tmp1, tmp2
  from table(t);

  dbms_output.put_line(tmp1);
  dbms_output.put_line(tmp2);
end;
/

drop type t_it;
drop type it;

Ở đây bạn có thể thấy vấn đề là bạn phải tạo các kiểu toàn cục, và đây là điều tôi không thích. Nhưng họ nói trong Oracle 12, nó có thể được thực hiện với các kiểu được xác định cục bộ nên tôi đang đợi nó :)

Đầu ra là:

Berlin, Oslo, Paris, Rome
Paris, Rome, Oslo, Berlin

CHỈNH SỬA

Theo như bạn không biết số lần lặp lại từ đầu, cách duy nhất là thực hiện kéo dài trên mỗi lần lặp (đây chỉ là ví dụ về việc mở rộng):

declare
  iterator       pls_integer := 1;
begin
  /* some type of loop*/ loop
    t.extend();

    -- one way to assign
    t(t.last) := new it(1,'Oslo',40);

    -- another way is to use some integer iterator
    t(iterator) := new it(1,'Oslo',40);

    iterator := iterator + 1;
  end loop;
end;

Tôi thích cách thứ hai hơn vì nó nhanh hơn (không tính toán .last trên mỗi lần lặp).



  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ảnh báo PHP khi khởi động khi cố gắng tải php_oci8.dll

  2. Lỗi khi tạo phần thân gói Oracle

  3. Nhận số lượng / tổng số ở mỗi cấp của truy vấn phân cấp bằng CONNECT BY

  4. java.lang.UnsatisfiedLinkError:không có ocijdbc11 trong java. library.path

  5. Tương thích Oracle 19c với jdk7