sql >> Databáze >  >> RDS >> Oracle

Jakou datovou strukturu použít pro třídění těchto dat v PL/SQL?

Je to velmi snadné, pokud používáte PL/SQL jako SQL a ne jako jiné jazyky. Je to docela specifické a někdy je to velmi pěkné právě proto.

Někdy opravdu nesnáším PL/SQL, ale tento případ je absolutně o lásce.

Podívejte se, jak je to snadné:

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;

Zde vidíte problém, že musíte vytvářet globální typy, a proto to nesnáším. Ale říkají, že v Oracle 12 to lze udělat s lokálně definovanými typy, takže na to čekám :)

Výstup je:

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

UPRAVIT

Pokud od začátku neznáte počet iterací, jediným způsobem je provést rozšíření při každé iteraci (toto je pouze příklad rozšíření):

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;

Dávám přednost druhému způsobu, protože je rychlejší (nepočítá .last v každé iteraci).



  1. Jak mohu hromadně aktualizovat záznamy pomocí sequelize.js a ignorovat určité sloupce

  2. MySQL získáte mindate a maxdate v jednom dotazu

  3. problém s časovačem ve formě orákula

  4. Změňte spojení nezpracovaných dotazů na laravel Eloquent