最近应公司要求导出数据为csv格式文件供业务人员存档查看,同时还需要按照指定分隔符导出其他文本格式,待数据迁移使用,就是根据指定的sql,按照指定的分隔符和文本格式导出数据。所使用的数据是oralce,由于生产环境又没有下载安装像sqluldr2之类的数据库导出工具。想着自己利用自带的sqlplus客户端写个通用的oracle导数脚本,查询资料,发现网上各种博客里描写的spool一键导出,都是花拳绣腿,用起来是真不好使,数据错位,分隔符混乱,断行显示各种问题都有,特此记录下自己的这个导出工具。
shell脚本
--help查看使用说明
#!/bin/bash
#################################################################################################################################
# name: sql export tool for oracle
# desc: export use MACKUP/SPOOL with sqlplus client
# Author Date version
# Epoch-Elysian 20231129 1.0
#
#################################################################################################################################
TYPE="csv" SEPERATOR="" FILE_PATH="" SPOOL_CONF="" EXPORT_SQL="" CLIENT_LANG="AMERICAN_AMERICA.AL32UTF8" HEADER="" USE_MACKUP="Y"
function usage {
cat <<EOF
Usage : sh $0 [options] -f <filepath> <sqltext>
examples : sh $0 -f /home/test.csv "select * from table;"
sh $0 -f /home/test.data -t text -s "|" --head="id;name;age" "select * from table;"
Options
-t, --type [ csv , text ] 导出文本类型: csv 和普通文本类型,不指定默认为[ csv ]
-f, --file 导出文件路径
-s, --seperator 设置字段分隔符,不指定默认情况下: csv [,] text [ TAB ]
--head 添加头部,使用[;]分割,例如:--head="id;name;age"
--lang 设置 sqlplus 客户端会话编码,默认值:[ AMERICAN_AMERICA .AL32UTF8]
--disable-mackup 默认使用 MACKUP 生成文本格式,导出时,特殊情况下可能会出现异常,可添加此参数禁用 MACKUP
此时程序会自动解析sql,为sql字段拼接分隔符后导出,禁用后具有局限性,对执行的sql要求如下:
1)不支持 select *,必须明确指定字段名
2)不支持字段别名,拼接分隔符时会导致 sql 语法错误
-- help
EOF
}
function init_options {
#指定 options 操作符
ARGS=$(getopt -o t:s:f: -l type:,seperator:,file:,head:,lang:,disable-mackup,help -n "$0" -- "$@")
# shellcheck disable=SC2181
if [ $? -ne 0 ]; then
usage