Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да сортирам асоциативен масив в PL/SQL?

Не можете да сортирате асоциативен масив по стойности, но трябва да конвертирате данните в друга структура от данни и да направите сортирането там. Най-лесният начин би бил да се преобразува в друг асоциативен масив, където ключовете и стойностите си разменят местата, но това изисква стойностите на ключовете също да са уникални.

По-долу е даден пример, адаптиран към вашия случай от Сортиране на PL/SQL колекции . Моля, проверете тази статия за подробности.

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

Разпечатки:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Трябва ли да използвам UCP на Oracle или HikariCP за модерно приложение?

  2. Можете ли да поставите няколко израза в един низ на заявка в Oracle jdbc?

  3. Създайте последователност с START WITH от Query

  4. Въпрос за присъединяване към SQL

  5. Вземете тип данни на полето в оператор select в ORACLE