Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Welche Datenstruktur soll verwendet werden, um diese Daten in PL/SQL zu sortieren?

Es ist sehr einfach, wenn Sie PL/SQL als SQL und nicht wie andere Sprachen verwenden. Es ist ziemlich spezifisch und manchmal gerade deshalb sehr nett.

Manchmal hasse ich PL/SQL wirklich, aber in diesem Fall geht es absolut um Liebe.

Sehen Sie, wie einfach es ist:

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;

Hier sehen Sie das Problem, dass Sie globale Typen erstellen müssen, und dafür hasse ich es. Aber sie sagen in Oracle 12, dass es mit lokal definierten Typen gemacht werden kann, also warte ich darauf :)

Die Ausgabe ist:

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

BEARBEITEN

Soweit Sie die Anzahl der Iterationen von Anfang an nicht kennen, besteht die einzige Möglichkeit darin, bei jeder Iteration zu erweitern (dies ist nur ein Beispiel für die Erweiterung):

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;

Ich bevorzuge den zweiten Weg, weil er schneller ist (.last wird nicht berechnet). bei jeder Iteration).