我需要对定义为“ 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/”
我怀疑问题出在我选择具有序数的列的方式上。显然不可能,但是没有列名(因为它是一个关联数组),所以我被卡住了。
答案 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在运行该语句之前会清空集合。您不会出错,但是也不会得到任何结果。