sql >> Databasteknik >  >> RDS >> Oracle

Hur sorterar man en associativ array i PL/SQL?

Du kan inte sortera en associativ array efter värden, men du måste konvertera data till någon annan datastruktur och göra sorteringen där. Det enklaste sättet hade varit att konvertera till en annan associativ array där nycklar och värden byter plats, men det kräver att dina nyckelvärden också ska vara unika.

Nedan är ett exempel anpassat till ditt fall från Sortera PL/SQL-samlingar . Vänligen kontrollera den artikeln för detaljer.

/* The sorting is done with SQL thus these types have to be SQL types. */

create type sortable_t is object(
  continent varchar2(32767),
  population number
);
/

create type sortable_table_t is table of sortable_t;
/

declare
  type continent_population_t is table of pls_integer index by varchar2(32767);
  continent_population continent_population_t;

  i varchar2(32767);

  sorted sortable_table_t := sortable_table_t();
begin
  /* Populate original data. */

  continent_population('Australia') := 30;
  continent_population('Antarctica') := 90;
  continent_population('UK') := 50;
  continent_population('USA') := 50;

  /* Convert to a helper data type that is used for sorting. */

  i := continent_population.first;

  while i is not null loop
    sorted.extend(1);
    sorted(sorted.last) := new sortable_t(i, continent_population(i));
    i := continent_population.next(i);
  end loop;

  /* Show that the content is not sorted yet. */

  dbms_output.put_line('Unsorted:');
  for j in sorted.first .. sorted.last loop
    dbms_output.put_line(sorted(j).continent || ' = ' || sorted(j).population);
  end loop;

  /* Sorting with SQL. */

  select cast(multiset(select *
                       from table(sorted)
                       order by 2 asc, 1 asc)
              as sortable_table_t)
    into sorted
    from dual;

  /* Show that the content is now sorted. */

  dbms_output.put_line('Sorted by value:');
  for j in sorted.first .. sorted.last loop
    dbms_output.put_line(sorted(j).continent || ' = ' || sorted(j).population);
  end loop;

end;
/

Utskrifter:

Unsorted:
Antarctica = 90
Australia = 30
UK = 50
USA = 50
Sorted by value:
Australia = 30
UK = 50
USA = 50
Antarctica = 90


  1. Det går inte att uppdatera enhetsdatamodellen från databasen på grund av TNS-fel

  2. Ge MySQL-användare bara de minsta privilegierna

  3. Hur SHOW CHARACTER SET fungerar i MariaDB

  4. Är det möjligt att lagra en bild i oracle 11g express edition?