1

我有一张有 10 万条记录的表。我正在编写基于此记录集的 XML 文件。我需要一次将 100 条记录写入文件。所以我将有 1000 个单独的文件。

目前为了限制写入文件的记录数,我正在使用

SELECT * FROM TABLE WHERE ROWNUM  < 100;

这会获取 100 条记录并将它们写入文件。当我再次这样做时,它将再次获取相同的 100 条记录。有什么方法可以消除它已经写好的记录吗?

我想创建一个表,我将在其中插入已写入文件的每条记录的主键。所以我会做

SELECT * FROM TABLE WHERE ROWNUM < 100 AND PRIMARYKEY NOT IN (SELECT PRIMARYKEY FROM ANOTHERTABLE);

我正在使用 Oracle 9i 和基于控制台的 c# 应用程序。我使用 ODP .NET 进行连接。

有没有其他方法可以完成这个过程?

4

2 回答 2

2

Tom Kyte 给出了限制 Oracle 获取的记录的通用解决方案。

select * 
  from ( select a.*, rownum rnum
           from ( YOUR_QUERY_GOES_HERE -- including the order by ) a
          where rownum <= MAX_ROWS )
 where rnum >= MIN_ROWS

http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:127412348064

我也同意 Scott Anderson 的观点,在这种情况下,只需获取所有记录并使用几个循环。

于 2010-09-14T16:15:33.307 回答
1

首先,你的select 语句应该是有序的,否则你不能保证每次都得到相同的 100 行。

您可以做的是有一个动态查询(如果您不想要一个存储过程,而不仅仅是在执行查询之前构建字符串和替换:start:end使用实际数值)限制rownum,可能类似于:

select *
from(
    select table.*, rownum rn
    from table
    where rownum rownum < :end
    order by ID) s
where s.rn >= :start

更新

我同意 Scott Anderson 的观点,为什么不在前端系统中一次获取所有记录并将记录分成 100 组?

于 2010-09-14T15:46:50.440 回答