我有一组主键。该集合按照记录的显示方式排序。
我想以与排序集中相同的顺序从数据库中检索记录。
目前我这样做:
cursor getdata is
select snr, -- snr is the primary key
field1,
field2,
field3
from MyTable,
(select COLUMN_VALUE snr, rownum sort_key from TABLE(varray_of_snr)) snr_tab
where MyTable.snr = snr_tab.snr
order by snr_tab.sort_key;
问题是Oracle不必以与varray
中相同的顺序读取内部选择中的行。无法保证Oracle不会从内部选择中的varray
以相反的顺序读取行。
是否有一种简单的方法可以保证排序顺序得以保留?
答案 0 :(得分:2)
据我所知,除非指定了ORDER BY,否则永远不会保证任何数据集的ORDER。
如果数组的顺序是任意的,我建议包括存储数据时填充的row_id字段。只有在推断排序并使用ORDER BY子句时才应使用rownum
。
答案 1 :(得分:1)
这就是我所做的:
我使用列temp_snr_sort
和snr
创建了一个全局临时表sort_id
。
然后我使用全局临时表将sort_id添加到我的snr:s。
-- Load the array with sort information into temp_snr_tab
for i in 1..varray_of_snr.last loop
insert into temp_snr_tab values (varray_of_snr(i), i);
end loop;
-- Get the data correctly sorted
open getdata for
select field1,
field2,
field3
from MyTable,
temp_snr_tab snr_tab
where MyTable.snr = snr_tab.snr
order by snr_tab.sort_id;
答案 2 :(得分:0)
更新:好的,一个ideea(可能有缺陷:) :)
CREATE OR REPLACE TYPE snr_type as OBJECT (
id number ,
srn number)
CREATE OR REPLACE TYPE varray_of_snr AS VARRAY(10000) OF snr_type;
然后创建您的varary以输入您的订单
然后通过id命令主sql。