Сортировка таблицы по индексу (ассоциативный массив) - PullRequest
0 голосов
/ 25 октября 2019

Мне нужно отсортировать ассоциативный массив, определенный как «таблица числовых индексов с помощью binary_integer». Я могу вручную написать алгоритм быстрой сортировки, но наверняка должен быть способ сортировки моих значений с помощью запроса (упорядочить по) ?

Иллюстрация моей проблемы:

Определение типа моего ассоциативного массива:

create or replace package my_type is 
   type my_array is table of NUMBER index by binary_integer;
end my_type ;

Для целей тестирования давайте сгенерируем тестовый массив со значениями, которые не отсортированы в порядке возрастания.

declare
  test my_array.my_type.;
  i number := 10;

begin
  while (i > 0) loop
       test(10 - i) :=  i;
       i := i - 1;
  end loop;
end;

Я бы хотел отсортировать этот массив в порядке возрастания, используя запрос с ORDER BY. Что-то вроде этого:

  i := 0;
  for query_result_row in (select 1 as val from table(test) order by 1) loop
     test(i) := query_result_row.val;
     i := i + 1;
  end loop;

Такой подход должен быть возможен: «Oracle 12c поддерживает запрос ассоциативных массивов с помощью оператора TABLE, если тип объявлен в спецификации пакета: https://galobalda.wordpress.com/2014/08/02/new-in-oracle-12c-querying-an-associative-array-in-plsql-programs/ "

Я подозреваю, что проблема связана с тем, как я выбираю столбец с порядковыми номерами. По-видимому, это невозможно, но имя столбца отсутствует (так как это ассоциативный массив), поэтому я застрял.

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

Вы даже можете сохранить некоторые строки кода с помощью BULK COLLECT:

DECLARE
  test my_array.my_type;
  i number := 10;
  CURSOR c IS
    SELECT t.column_value
    FROM table(test) t
    ORDER BY t.column_value;
begin
  -- Generating a test array with values that or not sorted in asc order
  while (i > 0) loop
       test(10 - i) :=  i;
       i := i - 1;
  end loop;

  OPEN c;
  FETCH c BULK COLLECT INTO test;
  CLOSE c;
END;

Примечание: Вы не можете просто написать SELECT с BULK COLLECT INTO. Похоже, что Oracle очищает коллекцию перед выполнением оператора. Вы не получаете ошибку, но вы также не получаете никаких результатов.

0 голосов
/ 25 октября 2019

Запрос ассоциативных массивов с помощью оператора TABLE работал. Как я и думал, проблема была в выборе столбца, он не работает с порядковыми номерами. Для ассоциативного массива, который идет через оператор таблицы, имя столбца для выбора - COLUMN_VALUE.

Завершенное решение:

Определение типа моего ассоциативного массива:

create or replace package my_type is 
   type my_array is table of NUMBER index by binary_integer;
end my_type ;

Генерация тестового массива со значениями, которые сортируются или не сортируются в порядке возрастания, и сортировка их:

declare
  test my_array.my_type.;
  i number := 10;

begin
  -- Generating a test array with values that or not sorted in asc order
  while (i > 0) loop
       test(10 - i) :=  i;
       i := i - 1;
  end loop;

-- Sorting the values :
for query_result_row in (SELECT COLUMN_VALUE from table(test) order by 1) loop
   i := i + 1;
   test(i) = query_result_row.COLUMN_VALUE;
end loop;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...