目前程序可以连接到数据库,并通过AdoCommand.CommandText传入要执行的SQL语句来导出数据.
我现在做法是把导出的数据放到Adodataset里,再保存到内存里,再save到文件里.发现这样导出数据还是很慢.特别是数据量很大的时候.
大概15W条记录需要12分钟左右的时间.
问一下大家,有没有办法直接调PL/SQL里的export功能.发现用PL/SQL里的export功能导出只需20秒左右.相差太大了.
希望大家出出主意.

解决方案 »

  1.   

    exp ...... tables=table_name query=条件。
    就是使用oracle提供的带条件的exp导出你想要的数据。
    不过如果是复合查询的话是无法用exp实现的。
    exp/imp,expdp/impdp都不是plsql的功能,而是oracle提供的恐惧而已。
    可以直接在delphi中以调用系统应用程序的方式调用。
      

  2.   

    首先谢谢doer_ljy的回复.
    我想再问一下.如果我这个导出的条件里有复合查询.那么有好的办法吗?我想做一个通用的导出程序,不单单局限于单表的导出.
      

  3.   

    严格意义上讲这就不是oracle数据导出,而是试图数据的到处了。
    我建议使用存储过程完成导出,思路是:
    1、由应用程序调用存储过程,向存储过程传递SQL文,最好也传递目标数据的结构(字段的情况等)。
    2、在存储过程中使用动态SQL绑定技术,从oracle中读取数据,写入文件中。
    3、从指定位置把生成好的文件读到目标位置。
    也可以使用Pro'C来实现,思路和上面一样。
    使用pro'c或者存储过程而不是使用ADO等方式是因为,在大数据量情况下,从ADO中调度内存和写入文件是比较困难的,而且它的速度也受到应用程序运行环境的限制,而油画这些事情正是oracle的专长。
      

  4.   

    你直接在delphi中调用sqlplus来实现就可以了例如导出指定的表保存到d盘123.dmp
    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!
      

  5.   

    恭喜doer_ljy升星.1.由应用程序调用存储过程,向存储过程传递SQL文,最好也传递目标数据的结构(字段的情况等)。 
    这个我不是很了解,AdoCommand.CommandText 里可以指定执行哪个存储过程吗.或是通过其它方式指定执行哪个存储过程?
    传递目标数据的结构?我把要导出的结构写在SQL语句里行吗?比如select name as UserName这种.2、在存储过程中使用动态SQL绑定技术,从oracle中读取数据,写入文件中。
    这个我自己可以研究一下.3.从指定位置把生成好的文件读到目标位置。
    这个是指把文件copy到目标位置吗?如果是的话也没有问题.
      

  6.   

    呵呵,谢谢
    对Delphi不是很熟悉,不过好像可以这么调用。LZ自己研究一下吧。ADOStoredProc := TADOStoredProc.Create(nil);   
    ADOStoredProc.Connection := ADOConnection;   
    ADOStoredProc.ProcedureName := '存储过程1';   //设定存储过程
    ADOStoredProc.Parameters.CreateParameter(...);   //设定出入参数值
    ADOStoredProc.Prepared := True;   
    ADOStoredProc.ExecProc;   
    ADOStoredProc.Free;   结构的话,其实就是你要select多少个字段,这对后面的绑定很关键。不传的话只有在plsql中自己分析了。
      

  7.   

    也可以把脚本写在批处理文件中,然后在delphi中利用winexec执行批处理文件