sql >> Database >  >> RDS >> Oracle

Hoe sorteer ik een associatieve array in PL/SQL?

U kunt een associatieve array niet sorteren op waarden, maar u moet de gegevens converteren naar een andere gegevensstructuur en daar de sortering uitvoeren. De gemakkelijkste manier zou zijn geweest om te converteren naar een andere associatieve array waar sleutels en waarden van plaats verwisselen, maar daarvoor moeten uw sleutelwaarden ook uniek zijn.

Hieronder is een voorbeeld aangepast aan uw geval van PL/SQL-verzamelingen sorteren . Raadpleeg dat artikel voor de details.

/* 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;
/

Afdrukken:

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


  1. Bindende variabele voor kolomnaam in PHP voor Postgresql-query

  2. Hoe laat je PyPy, Django en PostgreSQL samenwerken?

  3. Migreren van MySQL naar PostgreSQL

  4. Een GeoDjango-app testen met een PostGIS-database