基于排序的主键集检索数据

时间:2011-11-28 12:48:43

标签: sql oracle plsql

我有一组主键。该集合按照记录的显示方式排序。

我想以与排序集中相同的顺序从数据库中检索记录。

目前我这样做:

  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以相反的顺序读取行。

是否有一种简单的方法可以保证排序顺序得以保留?

3 个答案:

答案 0 :(得分:2)

据我所知,除非指定了ORDER BY,否则永远不会保证任何数据集的ORDER。

如果数组的顺序是任意的,我建议包括存储数据时填充的row_id字段。只有在推断排序并使用ORDER BY子句时才应使用rownum

答案 1 :(得分:1)

这就是我所做的:

我使用列temp_snr_sortsnr创建了一个全局临时表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。