目前程序可以连接到数据库,并通过AdoCommand.CommandText传入要执行的SQL语句来导出数据.
我现在做法是把导出的数据放到Adodataset里,再保存到内存里,再save到文件里.发现这样导出数据还是很慢.特别是数据量很大的时候.
大概15W条记录需要12分钟左右的时间.
问一下大家,有没有办法直接调PL/SQL里的export功能.发现用PL/SQL里的export功能导出只需20秒左右.相差太大了.
希望大家出出主意.
我现在做法是把导出的数据放到Adodataset里,再保存到内存里,再save到文件里.发现这样导出数据还是很慢.特别是数据量很大的时候.
大概15W条记录需要12分钟左右的时间.
问一下大家,有没有办法直接调PL/SQL里的export功能.发现用PL/SQL里的export功能导出只需20秒左右.相差太大了.
希望大家出出主意.
就是使用oracle提供的带条件的exp导出你想要的数据。
不过如果是复合查询的话是无法用exp实现的。
exp/imp,expdp/impdp都不是plsql的功能,而是oracle提供的恐惧而已。
可以直接在delphi中以调用系统应用程序的方式调用。
我想再问一下.如果我这个导出的条件里有复合查询.那么有好的办法吗?我想做一个通用的导出程序,不单单局限于单表的导出.
我建议使用存储过程完成导出,思路是:
1、由应用程序调用存储过程,向存储过程传递SQL文,最好也传递目标数据的结构(字段的情况等)。
2、在存储过程中使用动态SQL绑定技术,从oracle中读取数据,写入文件中。
3、从指定位置把生成好的文件读到目标位置。
也可以使用Pro'C来实现,思路和上面一样。
使用pro'c或者存储过程而不是使用ADO等方式是因为,在大数据量情况下,从ADO中调度内存和写入文件是比较困难的,而且它的速度也受到应用程序运行环境的限制,而油画这些事情正是oracle的专长。
procedure TForm1.Button1Click(Sender: TObject);
begin
winexec('sqlplus system/xxx@orcl grants=y file=d:\123.dmp tables=(t1,t2)',0);
end;
--导出指定条件的记录类似这样
exp sqlplus system/xxx@orcl tables=table1 query="""where id='7098'""" file=d:/123.dmp grants=y
good luck!
这个我不是很了解,AdoCommand.CommandText 里可以指定执行哪个存储过程吗.或是通过其它方式指定执行哪个存储过程?
传递目标数据的结构?我把要导出的结构写在SQL语句里行吗?比如select name as UserName这种.2、在存储过程中使用动态SQL绑定技术,从oracle中读取数据,写入文件中。
这个我自己可以研究一下.3.从指定位置把生成好的文件读到目标位置。
这个是指把文件copy到目标位置吗?如果是的话也没有问题.
对Delphi不是很熟悉,不过好像可以这么调用。LZ自己研究一下吧。ADOStoredProc := TADOStoredProc.Create(nil);
ADOStoredProc.Connection := ADOConnection;
ADOStoredProc.ProcedureName := '存储过程1'; //设定存储过程
ADOStoredProc.Parameters.CreateParameter(...); //设定出入参数值
ADOStoredProc.Prepared := True;
ADOStoredProc.ExecProc;
ADOStoredProc.Free; 结构的话,其实就是你要select多少个字段,这对后面的绑定很关键。不传的话只有在plsql中自己分析了。