Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jakiej struktury danych użyć, aby posortować te dane w PL/SQL?

Jest to bardzo proste, jeśli używasz PL/SQL jako SQL, a nie jak inne języki. Jest to dość specyficzne i czasami jest bardzo miłe właśnie z tego powodu.

Czasami naprawdę nienawidzę PL/SQL, ale w tym przypadku chodzi absolutnie o miłość.

Zobacz jakie to proste:

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;

Tutaj możesz zobaczyć problem, że musisz tworzyć typy globalne i za to go nienawidzę. Ale mówią, że w Oracle 12 można to zrobić za pomocą lokalnie zdefiniowanych typów, więc czekam na to :)

Dane wyjściowe to:

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

EDYTUJ

O ile nie znasz liczby iteracji od początku, jedynym sposobem jest wykonanie rozszerzenia na każdej iteracji (to jest tylko przykład rozszerzenia):

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;

Wolę drugi sposób, ponieważ jest szybszy (nie oblicza .last w każdej iteracji).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak utworzyć indeks dla dynamicznych ciągów wyszukiwania

  2. Oracle:OALL8 jest w niespójnym stanie

  3. jak wygenerować plan wyjaśnień dla całej procedury składowanej

  4. Zapytanie Oracle w celu uzyskania pierwszego identyfikatora transakcji na podstawie zużytej transakcji wychodzącej

  5. Wyjątek hibernacji Zapytanie nie zostało poprawnie zakończone