sql >> Databasteknik >  >> RDS >> Oracle

Vilken datastruktur ska man använda för att sortera dessa data i PL/SQL?

Det är väldigt enkelt om du använder PL/SQL som SQL och inte som andra språk. Det är ganska specifikt och ibland väldigt trevligt just därför.

Ibland hatar jag verkligen PL/SQL, men det här fallet handlar absolut om kärlek.

Se hur enkelt det är:

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;

Här kan du se problemet med att du måste skapa globala typer, och det är detta jag hatar det för. Men de säger att i Oracle 12 kan det göras med lokalt definierade typer så jag väntar på det :)

Utdata är:

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

REDIGERA

Så vitt du inte vet antalet iterationer från början är det enda sättet att göra förlängning på varje iteration (detta är bara ett exempel på förlängning):

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;

Jag föredrar det andra sättet eftersom det är snabbare (beräknar inte .last). på varje iteration).



  1. Finns det någon logisk anledning till att ha olika tabellutrymmen för index?

  2. Hur man lägger till just de distinkta värdena med SQLite Sum()

  3. Transactionscope kastar undantag denna plattform stöder inte distribuerade transaktioner när anslutningsobjekt öppnas

  4. Att använda tupler i ORACLE IN-sats och ett villkor för ett element i tupeln