批量从Oracle收集并填充到C#中的DataTable

时间:2011-12-30 04:07:28

标签: c# oracle bulk

在我的项目中,我需要从Oracle数据库中获取超过10,000,000条记录,以提高效率。我写了一个SP并使用BULK COLLECT,BULK COLLECT快速选择,不是吗? 程序如下:

create or replace type type_bulk as TABLE OF number(10);
/
create or replace PROCEDURE getbulk(returns OUT type_bulk) 
is
BEGIN
SELECT origseq BULK COLLECT
   INTO returns
   FROM Indicationinfo;
end;
/

然后我可以在PL / SQL中执行如下所示的SP:

declare
    origbulk type_bulk;
begin
    getbulk(returns => origbulk);
    dbms_output.put_line(origbulk.count);
end;

工作正常。

origbulk是一个表(或数组)。所以问题是:

1.如何在C#中执行上述SP;  2.如何获取原始数据到C#app;

我尝试如下(我使用OleDb驱动程序,而Provider是“OraOLEDB.Oracle.1”)

 string commText = 
"DECLARE ? type_bulk;\n" + 
"BEGIN\n" + 
"getbulk(returns => ?);\n" + 
"END;"; //here is right?
 myAccessCommand = new OleDbCommand(commText, myAccessConn);
 myAccessCommand.CommandType=CommandType.Text;
 OleDbParameter pout = new OleDbParameter("origseqbulk", ???what type, no OleDbType.Array, 10);

有什么建议吗? 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

Re:建议 - 将1000万行数据读入内存并不是“更有效”的方法。这将是非常缓慢的,因为数据库将需要一段时间才能返回10米行,并且因为需要另外很长时间(和大量内存)将这些值塞进控件中,如果这就是你正在做的事情。为了让您了解我的意思,我只是从一个较大的表中读取了100个行,并发现它花了大约26秒。没有什么复杂的,只是

SELECT A_COLUMN FROM MY_TABLE WHERE ROWNUM <= 100000

好的,这是你的1000万行的百分之一。现在,我永远不会声称我们的数据库具有高性能,但如果它代表您的情况,并且如果访问时间线性缩放,那么在您的1000万行中读取需要大约40分钟的时间。我想如果这是一个很大的批处理过程,那也许没关系。另一方面,如果你有一个用户坐在那里等待看到一些数据显示,他们可能会在数据显示在他们的屏幕上之前放弃。

分享并享受。