/** **/
DECLARE
lfFilelog UTL_FILE.FILE_TYPE;
lspath varchar2(50) := 'c:\';
lsfile varchar2(50) := 'file';
BEGIN
lfFilelog := UTL_FILE.FOPEN(lspath,lsfile||'.txt','w');
FOR r IN (SELECT FROM table) LOOP
UTL_FILE.PUT_LINE(lfFilelog ,r.row);
END LOOP;
UTL_FILE.FCLOSE_ALL;
EXCEPTION
WHEN UTL_FILE.INVALID_OPERATION THEN
UTL_FILE.PUT_LINE(lfFilelog,SQLERRM);
UTL_FILE.PUT_LINE(lfFilelog,' Invalid File open Operation');
UTL_FILE.FCLOSE_ALL;
RAISE_APPLICATION_ERROR(-20051,'Invalid File open Operation');
WHEN UTL_FILE.INVALID_FILEHANDLE THEN
UTL_FILE.PUT_LINE(lfFilelog,SQLERRM);
UTL_FILE.PUT_LINE(lfFilelog,' Invalid File Name');
UTL_FILE.FCLOSE_ALL;
RAISE_APPLICATION_ERROR(-20052,'Invalid File Name');
WHEN UTL_FILE.READ_ERROR THEN
UTL_FILE.PUT_LINE(lfFilelog,SQLERRM);
UTL_FILE.PUT_LINE(lfFilelog,' Read Error');
UTL_FILE.FCLOSE_ALL;
RAISE_APPLICATION_ERROR(-20053,'Read Error');
WHEN OTHERS THEN
UTL_FILE.PUT_LINE(lfFilelog,SQLERRM);
UTL_FILE.FCLOSE_ALL;
DBMS_OUTPUT.PUT_LINE(SQLERRM);
ROLLBACK;
END;
有许多方法可以从 Oracle 导出数据并自动执行功能。不过,请务必准确了解数据导出的用途。如果是用于系统间的互操作,则以您的接收系统可以理解的格式导出。如果是出于备份目的,请使用 exp/expdp(数据泵)方法,因为数据库备份需要存储的不仅仅是数据。(更好的是,只使用 RMAN。但我知道许多 DBA 也喜欢定期进行完整的数据库导出。)
您可以使用多种工具来完成此操作,TOAD 就是您想到的工具。它有一个强大的数据导出工具,支持调度。有一个免费版本,但我不确定它是否具有调度功能。不过值得一试。
或者,使用您已经可以使用的工具:SQL*PLUS、PL/SQL 和 cron(如果您运行 Windows,则使用 Windows 调度程序)。有关如何编写将表导出到 CSV 文件的 PL/SQL 例程的一个很好的示例,请参见http://asktom.oracle.com/pls/asktom/f?p=100:11:0:::: p11_question_id:88212348059。如果你使用一个过程,你可以从 Oracle 自己的作业调度器中调度它。
您也可以纯粹使用 SQL*PLUS 来做类似的事情(无需编写过程),但它不够灵活,但对于您想要的,它可能正是您所需要的。SQL*PLUS 也很容易编写脚本,因此您可以随时通过 cron/Windows 调度程序调用它。
SQL*PLUS 本身可以很好地创建良好的固定宽度报告,但也可以创建 HTML 和 CSV。XML 可能需要某种程序,但我不是这里的出口,所以 SQL*PLUS 在这里可能并不完美(不过,它会输出到 HTML,所以这可能已经足够好了)。如果导出到 Excel,请记住当前版本使用 XML 作为其文件格式,这使事情变得容易(以一种方式)但在其他方式(例如需要事先知道输出文件中将有多少行) )。
无论如何,通过一些工作和两个或三个工具的组合,您应该能够按照您想要的任何时间表以您希望的任何格式导出数据。
希望有帮助。