Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 限制查询获取的记录数_C#_.net_Oracle9i_Recordset - Fatal编程技术网

C# 限制查询获取的记录数

C# 限制查询获取的记录数,c#,.net,oracle9i,recordset,C#,.net,Oracle9i,Recordset,我有一张有100K条记录的桌子。我正在基于这个记录集编写一个XML文件。我需要一次将100条记录写入一个文件。因此,我将有1000个单独的文件 目前,为了限制写入文件的记录数,我使用 SELECT * FROM TABLE WHERE ROWNUM < 100; 这将获取100条记录并将它们写入一个文件。当我再次执行此操作时,它将再次获取相同的100条记录。有没有办法消除它已经写的记录 我考虑创建一个表,在其中插入已写入文件的每条记录的主键。 那我就这样做 SELECT * FROM

我有一张有100K条记录的桌子。我正在基于这个记录集编写一个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建立连接

有没有其他方法来执行此过程?

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

如果不需要存储过程,您可以使用动态查询,而只需在执行限制rownum的查询之前生成字符串并使用实际的数字值subscriptue:start和:end,可能类似于:

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


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

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

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

有什么原因不能获取整个100K记录并使用几个循环?100K不是那么多。如果:start等于或大于2,则上述查询不会返回任何行。你需要像这样的东西。从select a.*中选择*rownum,从您的查询中选择rownum rnum,在这里,包括按where rownum=MIN\u ROWS@RussllH的顺序:事实上,我已经忘记了这个扭曲。我会更新的;