按索引表(关联数组)排序

时间:2019-10-25 13:42:28

标签: sql oracle plsql

我需要对定义为“ 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 :(得分:0)

使用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;

答案 1 :(得分:0)

您甚至可以使用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;

注意:您不能仅使用BULK COLLECT INTO编写SELECT。看来,Oracle在运行该语句之前会清空集合。您不会出错,但是也不会得到任何结果。