从 oracle 将数据导出为 XSV
Export data as XSV from oracle
我想将一些数据(即一些查询结果)从旧的 oracle 数据库导出到一个文件中,值以指定的字符或字符序列分隔。 CSV 文件就是一个例子。
只有整数、varchars(不包括换行符)、日期、其他基本值(?)到结果集中,所以没有 LOB 或其他花哨的东西。只是纯数据,没有填充,没有包装,字段分隔并且可能包含在内。
实际上,我正在寻找来自 mysql 的简单 "SELECT ... INTO OUTFILE FIELDS TERMINATED BY ... [OPTIONALLY] ENCLOSED BY 'char'",但对于 Oracle。
我尝试使用 sqlplus,但任何程序都应该没问题,只要它在 linux 控制台上运行并且不是基于 java :-P。
很遗憾我不能使用"SET SQLFORMAT csv",好像不支持。
到目前为止,我得到了最好的结果:
printf "set echo off newpage 0 pagesize 0 arraysize 5000 feed off head off trimspool on trimout on\nselect field1 || '|' || field2 from table;" | sqlplus -S 数据库 > output_file
设置 arraysize 5000(最大)提供最佳性能,不幸的是,如果行长于 80 个字符,则换行结果。
设置 linesize 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
格式;如果不需要,请将其删除。
如果您真的不需要,请不要将 linesize 设置为那么高的数字 (30.000)。
此外,还有 set colsep ';'
将通过该分隔符分隔列(本例中为分号;可以是任何其他字符,例如您提到的 |
)。
为了加快假脱机速度:
- 关闭 termout
- 开启微调阀芯
- 运行 它在 服务器 上,而不是在客户端 PC 上
好的,对于遇到这个问题的每个人,这里是答案:
确保您至少安装了 oracle 客户端 12.2。
如果没有,您可以从 instantclient-basic-linux.x64-12.2.0.1.0.zip(库文件)和来自 linuxx64_12201_client.zip(client/stage/Components/oracle.sqlplus*)。这两个 zip 可在 oracle 下载站点免费下载(需要注册)。我不想安装该版本的客户端,因为它可能会与本地安装的版本混淆。这有点丑陋,但至少系统上没有文件被修改。
从 12.2 开始支持 "set markup csv" 命令,命令为:
打印 "set head off\nset feedback off\nset arraysize 5000\nselect field1, field2 from table;" | LD_LIBRARY_PATH=/path/to/oracle12/lib ORACLE_HOME=/path/to/oracle12 /path/to/oracle12/bin/sqlplus -M "CSV ON" -S 数据库
调整arraysize变量(5000最大最快,但要注意内存),选择"SET MARKUP CSV {ON|OFF} [DELIMI[TER] character] [QUOTE {ON|OFF}]"参数,享受
我想将一些数据(即一些查询结果)从旧的 oracle 数据库导出到一个文件中,值以指定的字符或字符序列分隔。 CSV 文件就是一个例子。
只有整数、varchars(不包括换行符)、日期、其他基本值(?)到结果集中,所以没有 LOB 或其他花哨的东西。只是纯数据,没有填充,没有包装,字段分隔并且可能包含在内。
实际上,我正在寻找来自 mysql 的简单 "SELECT ... INTO OUTFILE FIELDS TERMINATED BY ... [OPTIONALLY] ENCLOSED BY 'char'",但对于 Oracle。
我尝试使用 sqlplus,但任何程序都应该没问题,只要它在 linux 控制台上运行并且不是基于 java :-P。
很遗憾我不能使用"SET SQLFORMAT csv",好像不支持。
到目前为止,我得到了最好的结果:
printf "set echo off newpage 0 pagesize 0 arraysize 5000 feed off head off trimspool on trimout on\nselect field1 || '|' || field2 from table;" | sqlplus -S 数据库 > output_file
设置 arraysize 5000(最大)提供最佳性能,不幸的是,如果行长于 80 个字符,则换行结果。
设置 linesize 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
格式;如果不需要,请将其删除。
如果您真的不需要,请不要将 linesize 设置为那么高的数字 (30.000)。
此外,还有 set colsep ';'
将通过该分隔符分隔列(本例中为分号;可以是任何其他字符,例如您提到的 |
)。
为了加快假脱机速度:
- 关闭 termout
- 开启微调阀芯
- 运行 它在 服务器 上,而不是在客户端 PC 上
好的,对于遇到这个问题的每个人,这里是答案:
确保您至少安装了 oracle 客户端 12.2。 如果没有,您可以从 instantclient-basic-linux.x64-12.2.0.1.0.zip(库文件)和来自 linuxx64_12201_client.zip(client/stage/Components/oracle.sqlplus*)。这两个 zip 可在 oracle 下载站点免费下载(需要注册)。我不想安装该版本的客户端,因为它可能会与本地安装的版本混淆。这有点丑陋,但至少系统上没有文件被修改。
从 12.2 开始支持 "set markup csv" 命令,命令为: 打印 "set head off\nset feedback off\nset arraysize 5000\nselect field1, field2 from table;" | LD_LIBRARY_PATH=/path/to/oracle12/lib ORACLE_HOME=/path/to/oracle12 /path/to/oracle12/bin/sqlplus -M "CSV ON" -S 数据库
调整arraysize变量(5000最大最快,但要注意内存),选择"SET MARKUP CSV {ON|OFF} [DELIMI[TER] character] [QUOTE {ON|OFF}]"参数,享受