目前在一家电信公司就职报表开发工程师,2010年开始从事运维方面的工作,期间从事过业务维护工程师、自动化运维工程师,2016年转为报表开发工程师。有耐心,抗压力、爱折腾,喜欢研究自动化工具。
分类: Oracle
2018-03-02 16:59:14
原文地址:ORCLE如何导出大量数据到txt 作者:jsustchenjin
set echo off; --在用start命令执行一个sql脚本时,是否显示脚本中正在执行的SQL语句
set space 0; --是否显示当前sql语句查询或修改的行数
set linesize 15000;--设置屏幕显示行宽,默认100
set newpage none --会在页和页之间没有任何间隔
set pagesize 0; --分多少页
set feedback off; --是否显示当前sql语句查询或修改的行数
set heading off; --禁止输出列标题
set term off; --在用spool命令将一个大表中的内容输出到一个文件中时,将内容输出在屏幕上会耗费大量的时间,设置set termspool off后,则输出的内容只会保存在输出文件中,不会显示在屏幕上,极大的提高了spool的速度。
set verify off --//可以关闭和打开提示确认信息old 1和new 1的显示
set numwidth 38 --//输出number类型域长度,缺省为10
set trimspool on; --默认为OFF,设置查询耗时,可用来估计SQL语句的执行时间,测试性能
spool /nt_bill/yj/wyh_kdkb_data.txt;
select
TRIM(BILLING_NBR)||'|
'||TRIM(BIND_ATTR)||'|'||TRIM(NAS_IP)||'|'||TRIM(DQ)||'|'||TO_CHAR(last_date,'YYYYMMDDHH24MISS')
from
wyh_kdkb;
SPOOL OFF;
spool
/nt_bill/yj/wyh_iptv_data.txt;
select
TRIM(BILLING_NBR)||'| '||TRIM(BIND_ATTR)||'|'||TRIM(NAS_IP)||'|'||TRIM(DQ)||'|'||TO_CHAR(last_date,'YYYYMMDDHH24MISS')
from
wyh_kdkb_iptv;
SPOOL OFF;
方法二:使用UTL_FILE包的文件操作命令
操作步骤(只需要一步,也可以封装成存储过程)
编写PL/SQL过程,导出到txt即可。
Sql代码:
DECLARE
row_result varchar2(1024);
selectsql varchar2(1024);
qrycursor SYS_REFCURSOR;
txt_handle UTL_FILE.file_type;
BEGIN
selectsql := ' select bizname ||'' ''|| bizstatus from
bizbusinessbaseinfo ';
txt_handle := UTL_FILE.FOPEN('D:/UTL','a.txt','w');
open qrycursor for selectsql;
loop
fetch qrycursor into row_result;
exit when qrycursor%notfound;
UTL_FILE.PUT_LINE(txt_handle,row_result);
end loop;
--关闭游标
close qrycursor;
UTL_FILE.FCLOSE(txt_handle);
end;
注意事项:
如果没有设置参数utl_file_dir参数,本方法会报ora 29280的错误,解决方案有两种。
1. 设置utl_file_dir参数,两种方式:
a) 在init.ora中设置,直接修改文件即可
b) 在sqlplus命令行设置
alter system set utl_file_dir=* scope=spfile;
注意设置utl_file_dir的要点:
utl_file_dir=* 这表示你能操作任何目录,尽量不要用
utl_file_dir=d:\ 这表示你能操作d:\目录下的文件,但你不能操作d:\目录下的子目录
注意在设置 utl_file_dir=路径时,如果路径是长路径名,例如c:\my temp目录,则你必须加上'',例如: utl_file_dir='c:\my temp'
utl_file_dir可以是多个路径 utl_file_dir=c:\,d:\,d:\temp,'c:\my temp'
设置完必须重新启动数据库
2. 创建自己的目录(不需要重启数据库)
在命令行中执行命令create or replace directory MY_DIR as 'c:/abc';即可。然后调用的时候,把frw:=utl_file.fopen('c:\abc','emp.txt','w');改成frw:=utl_file.fopen('MY_DIR','emp.txt','w');注意MY_DIR要大写。
优点:容易封装成存储过程
缺点:要使用UTL_FILE配置,稍微复杂点