Oracle
 sql >> база данни >  >> RDS >> Oracle

Каква структура от данни да използвам, за да сортирам тези данни в PL/SQL?

Много е лесно, ако използвате PL/SQL като SQL, а не като други езици. Доста е специфичен и понякога е много хубав точно заради това.

Понякога наистина мразя PL/SQL, но този случай е абсолютно за любов.

Вижте колко е лесно:

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;

Тук можете да видите проблема, че трябва да създавате глобални типове и това е, за което го мразя. Но казват, че в Oracle 12 може да се направи с локално дефинирани типове, така че го чакам :)

Резултатът е:

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

РЕДАКТИРАНЕ

Доколкото не знаете количеството повторения от началото, единственият начин е да правите разширение при всяка итерация (това е само пример за разширяване):

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;

Предпочитам втория начин, защото е по-бърз (не изчислява .last на всяка итерация).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLT и разделяне

  2. NUMTODSINTERVAL в PostgreSQL

  3. 1000000 до 1M и 1000 до 1K в Oracle заявка

  4. Синтактична грешка. Липсваща ключова дума в оператора case в клаузата WHERE

  5. Експортиране на файл с последователност към Oracle от Sqoop