通過spool工具抽取Oracle資料庫表資料落地檔案
阿新 • • 發佈:2021-01-14
技術標籤:資料庫Shelloraclelinuxshell資料庫
通過spool
工具抽取Oracle資料庫表資料落地檔案
文章目錄
前言
此前博文寫了通過
sqlldr
工具裝載資料入Oracle資料庫表,可參考通過sqlldr工具載入資料入Oracle庫表今天我們再說下,通過
spool
工具抽取Oracle資料庫表資料,落地為資料檔案
spool
引數釋義
pagesize
設定每頁允許輸出的最大行數,預設為24,避免分頁可設定為0linesize
設定每行允許輸出的最大字元,預設為80,這個應該根據需要設定,太小會造成該行顯示不全,太大了會導致匯出的檔案變大feedback
設定是否顯示處理記錄的條數heading
設定是否顯示資料的欄位名echo
設定是否顯示執行的SQL命令closep
設定域輸出分隔符trimspool
設定是否去除每行末尾的空格termout
設定是否顯示指令碼中的命令執行結果newwidth
設定輸出number型別域的長度timing
設定是否顯示“已用時間:xxx”wrap
讓它不要自動換行,當行的長度大於LINESIZE的時候,超出的部分會被截掉newpage
設定頁與頁之間的分隔{1|n|NONE};當值為0時在每頁開頭有一個小的黑方框;當值為n時在頁和頁之間隔著n個空行;當為none時,會在頁和頁之間沒有任何間隔
指令碼引數說明
dbSid
: Orale庫SIDdbUser
: Oracle資料庫使用者名稱dbPass
: Oracle資料庫密碼ctlFile
: 資料控制檔案dataFile
: 資料檔案datadate
: 資料日期dbcode
: 資料庫編碼
ctl控制檔案說明
ctl檔案中為sql語句
注意:語句中不能帶有分號";"
ctl檔案示例
select
EMPNO||'|'||
ENAME||'|'||
JOB||'|'||
MGR||'|'||
HIREDATE||'|'||
SAL||'|'||
COMM||'|'||
DEPTNO
from emp
指令碼原始碼
#!/bin/bash
dbSid=$1
dbUser=$2
dbPass=$3
ctlFile=$4
dataFile=$5
datadate=$6
dbcode=$7
ctlName=`basename ${ctlFile}`
#Sys data [yyyymmdd]
sysDate=`date +'%Y%m%d'`
#Define log params
logPath=/app/log/public/ora_spool_data/${sysDate}
logFile=${logPath}/${ctlName}.log
#Log function
Log()
{
createTime=`date +"%Y-%m-%d %H:%M:%S"`
echo "[${createTime}] $*" |tee -a ${logFile} 2>/dev/null
}
#CheckDir function
CheckDir()
{
if [ ! -d $1 ]; then
mkdir_log=` mkdir -p -m 775 $1 `
if [ $? -ne 0 ]; then
Log "[ERROR] [$1] create failed, dir not exist, please check..."
exit 255
fi
fi
}
CheckDir "${logPath}"
################### Main program ###################
#check the parameter
if [ $# -ne 6 -a $# -ne 7 ]; then
Log "[ERROR] Please input the right parameter ..."
Log "[ERROR] Eg:sh ora_spool_data.sh oraSid user passwd /app/file/userinfo.ctl /app/file/userinfo.del"
exit 1
fi
#Check ctlFile
if [ ! -f ${ctlFile} ];then
Log "[ERROR] ${ctlFile} not exist, please check..."
exit 2
fi
if [ "${dbcode}" != "X" ];then
export NLS_LANG=${dbcode}
fi
#Check datapath
datapath=`dirname ${dataFile}`
if [ ! -d ${datapath} ];then
Log "[ERROR] ${datapath} is not exists, please check...."
exit 3
fi
Log "=============${ctlFile}============="
Log "[INFO]: Begin to spool data to ${dataFile} from ${tabName}"
#Begin time
beginTime=`date +"%Y-%m-%d %H:%M:%S"`
sql=`cat ${ctlFile}|sed -e 's/#datadate#/'${datadate}'/g'`
Log "${sql}"
sqlplus -s ${dbUser}/${dbPass}@${dbSid}<<EOF>/dev/null
set trimspool on
set echo off
set linesize 30240
set pagesize 0
set newpage 1
set heading off
set term off
set feedback off
spool ${dataFile}
$sql;
exit;
spool off
EOF
#End time
endTime=`date +"%Y-%m-%d %H:%M:%S"`
Log "[INFO]: beginTime: ${beginTime}"
Log "[INFO]: endTime: ${endTime}"
costTime=`expr $(date +%s -d "${endTime}") - $(date +%s -d "${beginTime}")`
hour=`expr $costTime / 3600`
min=`expr $costTime % 3600 / 60`
sec=`expr $costTime % 3600 % 60`
Log "[INFO]: End to spool data to ${dataFile} from ${tabName}, ${hour}h${min}m${sec}s..."
Log "[INFO]: dataFile:${dataFile}"
Log "[INFO]: logFile :${logFile}"
結語
如有需要請拿走,若轉載請追加本文連結哦!
能學一點是一點,至少不是0!
Over!