我想从旧的Oracle数据库中导出一些数据(即某些查询结果')到文件中,这些值用指定的字符或字符序列分隔。 CSV文件就是一个示例。
仅将整数,varchars(不包括换行符),日期,其他基本值(?)放入结果集中,因此没有LOB或其他花哨的东西。只是纯数据,没有填充,没有包裹,字段分开并且可能被封闭。
实际中,我正在寻找一个简单的“ SELECT ... INTO OUTFILE FIELDS BY ... ... [OPTIONALLY] ENCLOSED BY'char'”,但是对于Oracle。
我尝试使用sqlplus,但是任何程序都可以,只要它在linux控制台上运行并且它不是基于Java的:-P。
很遗憾,我无法使用“ SET SQLFORMAT csv”,似乎不受支持。
到目前为止,我获得了类似以下的最佳结果:
printf“设置回显关闭新页面0页面大小0数组大小5000送出关闭修剪上的修剪池\ n选择字段1 ||'|' ||表格中的field2;” | sqlplus -S数据库> output_file
设置arraysize 5000(最大)可提供最佳性能,不幸的是,如果行长超过80个字符,则包装结果。
将行大小设置为30000(或什至32767)会取消换行,但是不幸的是,性能变得很差。我不想为每个查询指定最大行数(计算结果中每个字段的最大大小),希望性能会提高。
阅读了无数答案之后,我仍然没有找到应该既正确又性能出色的解决方案。我的下一个电话将是编写一个php文件来完成这项工作,但这是胡说八道,恕我直言,使用默认应用程序sqlplus应该会提供最佳性能...
任何想法?
我无法确定这组SET
命令是否会有所帮助(通常我会使用它,但是-尝试一下。)>
set termout off set trimspool on set echo off set verify off set autoprint off set serveroutput off set arraysize 1000 set pagesize 0 set linesize 100 set long 10000 set numwidth 10 set feedback off set colsep ';' col empno format 99999 col ename format a10 col sal format 999G990 spool emp.txt select empno, ename, sal from emp; spool off
在底部,您可以看到一些
COL
格式;如果您不需要它,请将其删除。
如果您确实不需要,请不要将行大小设置为该高数字(30.000)。
[还有,set colsep ';'
会通过该分隔符将列分开(在此示例中为分号;可以是任何其他字符,例如您提到的|
。]
为了加快线轴:
好吧,对于每个有此问题的人,这是答案: