在我的项目中,我需要从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);
有什么建议吗? 谢谢你的帮助。
答案 0 :(得分:0)
Re:建议 - 将1000万行数据读入内存并不是“更有效”的方法。这将是非常缓慢的,因为数据库将需要一段时间才能返回10米行,并且因为需要另外很长时间(和大量内存)将这些值塞进控件中,如果这就是你正在做的事情。为了让您了解我的意思,我只是从一个较大的表中读取了100个千行,并发现它花了大约26秒。没有什么复杂的,只是
SELECT A_COLUMN FROM MY_TABLE WHERE ROWNUM <= 100000
好的,这是你的1000万行的百分之一。现在,我永远不会声称我们的数据库具有高性能,但如果它代表您的情况,并且如果访问时间线性缩放,那么在您的1000万行中读取需要大约40分钟的时间。我想如果这是一个很大的批处理过程,那也许没关系。另一方面,如果你有一个用户坐在那里等待看到一些数据显示,他们可能会在数据显示在他们的屏幕上之前放弃。
分享并享受。