Oracle通过SPOOL导出数据Excel、CSV、TXT格式

  <从来不需要解释 那些所谓奇怪的事 你是上天的恩赐 因为珍惜学会坚持……>

1. SPOOL基础

  SPOOL用的频率蛮高的一个命令工具,主要是配合SQLPLUS的SET命令使用,常用的如下:

  • SET ECHO {ON | OFF}:控制在执行命令时,START命令是否在脚本中列出每个命令;
  • SET TIMI [NG] {ON | OFF}:控制返回执行时间 ;
  • SET TI [ME] {ON | OFF}:控制当前时间的显示;
  • SET HEA [DING] {ON | OFF}:控制列名显示;
  • SET FEED[BACK] {6 | n | ON | OFF | ONLY}] [SQL_ID]:当查询结果数据行数大于等于N时,返回本次SQL结果集数据行数;
  • SET LIN[ESIZE] {80 | n | WINDOW}:控制每行字符的个数(1个汉字两个字符);
  • SET PAGES[IZE] {14 | n}:每页显示的数据行数;
  • SET NEWP[AGE] {1 | n | NONE}:设置从每页顶部到顶部标题要打印的空白行数;
  • SET TRIMS [POOL] {ON | OFF}:去掉spool输出时每行的拖尾空格;
  • SET TRIM [OUT] {ON | OFF}:去除标准输出每行的拖尾空格;
  • SET TERM[OUT] {ON | OFF}:控制由脚本执行的命令生成的输出的显示;
  • SET COLSEP { | text}:列分隔符设置;
  • SET MARK[UP]:输出CSV格式数据或HTML标记文本;
  • SET PRE[FORMAT] {ON|OFF}:默认值是 OFF,即默认输出数据到HTML 表格中,要使用 <PRE>标签生成输出报表必须设置 PREFORMAT ON。

  部分参数的默认值如下:

[oracle@chengyu ~]$ sqlplus / as sysdba

SQL*Plus: Release 18.0.0.0.0 - Production on Fri Jul 10 11:36:15 2020
Version 18.3.0.0.0
Copyright (c) 1982, 2018, Oracle.  All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
Session altered.
11:36:15 SQL> show arraysize;
arraysize 15
11:36:29 SQL> show autocommit;
autocommit OFF
11:36:40 SQL> show echo
echo OFF
11:37:15 SQL> show feedback
FEEDBACK ON for 6 or more rows SQL_ID OFF
11:37:28 SQL> show heading
heading ON
11:37:37 SQL> show linesize
linesize 80
11:37:42 SQL> show pagesize
pagesize 14
11:37:49 SQL> show serveroutput
serveroutput OFF
11:37:56 SQL> show sqlprompt
sqlprompt "_DATE SQL> "
11:38:03 SQL> show time
time OFF
11:38:09 SQL> show timing
timing OFF
11:38:15 SQL> show newpage
newpage 1
16:38:13 SQL> show trimspool 
trimspool OFF
16:42:10 SQL> show termout
termout ON

  更详尽的SET选项参考:https://docs.oracle.com/en/database/oracle/oracle-database/20/sqpug/SET-system-variable-summary.html#GUID-A6A5ADFF-4119-4BA4-A13E-BC8D29166FAE

2. SPOOL使用示例

  本节2个简单示例是我平时用的最多的,实际使用中可以根据需要进行set个性化数据输出。

  1. 导出数据到TXT或者CSV格式,一般数据量比较大的情况都是采用CSV或者TXT导出,不受Excel表的数据行数极限限制,当然如必要,也可以拆分成多个Excel来导出。
set linesize 1000
set pagesize 0
set echo off
set heading off
set feedback off
set colsep "|" --数据分隔符设置
set trims ON --去掉空字符,等同于set trimspool on
set term off --查询结果仅仅显示在输出文件中,不会显示在屏幕上
set trimout on
spool '/home/oracle/test1_2020071301.txt'
select * from test1;
spool '/home/oracle/test2_2020071302.txt'
select * from test2;
spool off;
exit;
  1. 导出数据到Excel格式,在这部分内容之前可以先阅读一下Oracle官文—关于CSV和HTML数据输出的介绍:https://docs.oracle.com/en/database/oracle/oracle-database/20/sqpug/generating-HTML-reports-from-SQL-Plus.html#GUID-BCC83F09-A432-4A6F-A8BA-1A099A5830BF,除了TXT输出外,SQL*Plus命令行界面支持生成完整的HTML网页输出或CSV格式的数据输出,使用SQLPLUS -MARKUP“ HTML ON”或SET MARKUP HTML ON SPOOL ON来生成完整的HTML页面,这些页面自动用和标记封装,也可以使用SQLPLUS -MARKUP“ CSV ON”或SET MARKUP CSV ON生成CSV格式的报告。
set linesize 300
set heading on
set term off verify off feedback off pagesize 100
--生成完整的HTML页面格式化输出成Excel,或者使用SET MARKUP CSV ON生成CSV格式的报告
set markup html on entmap ON spool on preformat off 
spool /home/oracle/test_20200713.xls
select * from test;
spool off;
exit;

3. 简化SPOOL导出的一个小(偷懒)脚本

  每次导出的工作内容大同小异,小小减少重复性的工作(脚本以Excel为例,欢迎指正、优化):

#!/bin/bash
# Script:export.sh
# Author:ChengYu
# Date:2014-03-21
# PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/home/oracle/product/bin:/root/bin
# export PATH

dir=/home/oracle
source ~/.bash_profile
echo "    this shell is help you to manage *** Server,it can startup or shutdown http service,DB service,remove cache,log files,input/output DB data and so on."
echo "    the options are:"
echo "          1 restart *** tomcat and remove cache;"
echo "          2 restart *** tomcat and remove cache,log files;"
echo "          3 input or output some user data(For Oracle database);"
echo "          4 export table for excel;"
printf "please enter option what you need:"
read option
until [[ $option =~ ^[1-4]+$ ]]
do
	printf "[error]: $option is invalid option,please enter the effective option:"
	read option
done

exportExcel(){
    echo "please enter user_name/password:"
    read pass
	echo "please enter export excel name:"
	read name
	echo "please enter the sql what you want to export:"
	read sql
    echo "$sql" >> $dir/get_tables.sql
	echo "set linesize 200" >> $dir/main.sql
    echo "set heading on" >> $dir/main.sql
	echo "set term off verify off feedback off pagesize 999" >> $dir/main.sql
	echo "set markup html on entmap ON spool on preformat off" >> $dir/main.sql
	echo "spool $dir/$name.xls" >> $dir/main.sql
	echo "start $dir/get_tables.sql" >> $dir/main.sql
	echo "spool off" >> $dir/main.sql
	echo "exit" >> $dir/main.sql
	chown oracle $dir/main.sql
	chown oracle $dir/get_tables.sql
    chmod 644 $dir/main.sql
    chmod 644 $dir/get_tables.sql
    su - oracle -c "sqlplus $pass @$dir/main.sql"
	yes|rm $dir/main.sql
	yes|rm $dir/get_tables.sql
}

case $option in
    1)
	echo "this is the 1 options"
	;;
    2)
	echo "this is the 2 options"
	;;
    3)
	echo "this is the 3 options"
	;;
    4)
	echo "this is the 4 options"
	exportExcel
	;;
    *)
	echo "other options"
	;;
esac

2020年07月12日

  因为微信列表里一个陌生号,我们克制着进行了一场无畏的争论,一个不听解释,换上衣服出去跑步,一个不再解释,站在阳台上大喘气。

  介意男性的靠近无可厚非,女的也这么警惕,难不成我还能把自己掰弯了?

  很多话缠绕在喉头,却一个字都多余,过分在乎又无法建立对等的信任,彼此都会很疲累。

  冷静,24点翻过这一篇。

### 回答1: Oracle命令spool可以用来将查询结果导出CSV格式的文件。具体操作步骤如下: 1. 打开SQL*Plus命令行工具,连接到Oracle数据库。 2. 输入以下命令,设置输出文件的路径和文件名: spool /path/to/output/file.csv 其中,/path/to/output/是输出文件的路径,file.csv是输出文件的文件名。 3. 输入查询语句,例如: SELECT * FROM table_name; 4. 输入以下命令,结束查询并将结果导出CSV文件: spool off; 5. 导出CSV文件可以在指定的输出路径中找到。 注意事项: - 导出CSV文件中,每个字段之间用逗号分隔,每行数据以换行符结束。 - 如果查询结果包含中文字符,需要设置NLS_LANG环境变量,以保证导出CSV文件中的中文字符正确显示。 - 如果查询结果较大,可能需要设置SQL*Plus的行大小和页大小,以保证查询结果正确显示和导出。 ### 回答2: spoolOracle SQL Developer中的一个命令,允许将查询结果将结果输出到一个文件中。而.csv是一种常用的数据格式,它可以用文本编辑器打开,也可以用Excel等软件进行导入导出。 在Oracle SQL Developer中使用spool导出csv,可以按照如下步骤: 1. 打开Oracle SQL Developer,连接到目标数据库。 2. 在SQL Workshop中选择SQL命令行或SQL脚本。 3. 输入查询语句,例如: SELECT * FROM employees; 4. 输入以下命令: SET COLSEP ',' --设置字段分隔符为逗号 SET ECHO OFF --不在输出中显示spool命令 SET FEEDBACK OFF --不在输出中显示行计数 SET LINESIZE 1000 --设置每行输出的最大字符数 SET PAGESIZE 0 --不分页 SET TERMOUT OFF --不向脚本输出设备输出结果 5. 输入以下命令,将查询结果输出到csv文件中,并且关闭spool输出: SPOOL C:\temp\employees.csv SELECT * FROM employees; SPOOL OFF 以上命令将查询结果保存到C:\temp\employees.csv文件中。 6. 通过文本编辑器或Excel等软件打开C:\temp\employees.csv文件,即可查看或编辑查询结果。 需要注意的是,使用spool导出csv文件时,需要保证每个字段都能正确地映射到csv文件中的一列。如果存在字段中包含逗号、换行符等特殊字符,需要进行处理。可以在sql语句中使用函数来将特殊字符转义或替换,例如使用REPLACE函数替换逗号。 ### 回答3: Oracle是一种关系型数据库管理系统,其命令spool可以用来导出数据CSV文件中。CSV,即逗号分隔值,是一种常用的文件格式,它以逗号作为数据元素之间的分隔符,可以用于在不同的软件系统之间交换数据。 在使用Oracle命令spool导出CSV文件之前,需要先确认表中需要导出数据。可以使用SELECT语句查询所需的数据并验证其正确性。假设我们需要导出一个叫做“employees”的表中的所有数据,那么命令应该是: SELECT * FROM employees; 接下来就可以将结果导出CSV文件中。可以使用以下命令来开始 spool: SET colsep ',' ( 设置CSV的分隔符为逗号) SET pagesize 0 (取消默认分页,这样输出的结果就不会分页了) SET trimspool ON (去掉导出CSV文件中的空格) SET linesize 1000 (设置每行输出的字符数) SET feedback OFF (关闭信息输出,避免在CSV文件中输出非结果信息) SPOOL /filepath/filename.csv (指定导出CSV文件路径和文件名) SELECT * FROM employees; (查询需要导出数据SPOOL OFF (停止导出) 最后需要注意的是,导出CSV文件可能出现乱码问题,这是因为不同系统的编码格式不同。可以使用文本编辑器打开CSV文件并将其另存为UTF-8格式即可解决此问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值