sql >> Database >  >> RDS >> Oracle

Welke gegevensstructuur moet worden gebruikt om deze gegevens in PL/SQL te sorteren?

Het is heel gemakkelijk als je PL/SQL als SQL gebruikt en niet zoals andere talen. Het is vrij specifiek en soms juist daarom erg leuk.

Soms heb ik echt een hekel aan PL/SQL, maar deze zaak gaat absoluut over liefde.

Zie hoe gemakkelijk het is:

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 zie je het probleem dat je globale typen moet maken, en dit is waar ik een hekel aan heb. Maar ze zeggen dat het in Oracle 12 kan worden gedaan met lokaal gedefinieerde typen, dus ik wacht erop :)

De uitvoer is:

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

BEWERKEN

Voor zover je het aantal iteraties vanaf het begin niet weet, is de enige manier om elke iteratie uit te breiden (dit is slechts een voorbeeld van verlengen):

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;

Ik geef de voorkeur aan de tweede manier omdat deze sneller is (berekent niet .last bij elke iteratie).



  1. Hoe op te lossen "Er moet een correlatienaam worden opgegeven voor de bulkrijenset in de from-clausule." in SQL Server

  2. Primaire sleutelreeks van PostgreSQL verloren na migratie met AWS DMS

  3. Mysql te traag bij eenvoudige query tussen twee tabellen

  4. Een resultaat beperken met PHP, zonder de LIMIT-clausule te gebruiken bij het ophalen van rijen in de databasequery?