1. 程式人生 > 其它 >通過spool工具抽取Oracle資料庫表資料落地檔案

通過spool工具抽取Oracle資料庫表資料落地檔案

技術標籤:資料庫Shelloraclelinuxshell資料庫

通過spool工具抽取Oracle資料庫表資料落地檔案

文章目錄

前言

此前博文寫了通過sqlldr工具裝載資料入Oracle資料庫表,可參考通過sqlldr工具載入資料入Oracle庫表

今天我們再說下,通過spool工具抽取Oracle資料庫表資料,落地為資料檔案

spool引數釋義

  • pagesize 設定每頁允許輸出的最大行數,預設為24,避免分頁可設定為0
  • linesize
    設定每行允許輸出的最大字元,預設為80,這個應該根據需要設定,太小會造成該行顯示不全,太大了會導致匯出的檔案變大
  • feedback 設定是否顯示處理記錄的條數
  • heading 設定是否顯示資料的欄位名
  • echo 設定是否顯示執行的SQL命令
  • closep 設定域輸出分隔符
  • trimspool 設定是否去除每行末尾的空格
  • termout 設定是否顯示指令碼中的命令執行結果
  • newwidth 設定輸出number型別域的長度
  • timing 設定是否顯示“已用時間:xxx”
  • wrap 讓它不要自動換行,當行的長度大於LINESIZE的時候,超出的部分會被截掉
  • newpage 設定頁與頁之間的分隔{1|n|NONE};當值為0時在每頁開頭有一個小的黑方框;當值為n時在頁和頁之間隔著n個空行;當為none時,會在頁和頁之間沒有任何間隔

指令碼引數說明

  • dbSid: Orale庫SID
  • dbUser: 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!