oracle 數據批量導出工具

#!/bin/ksh
#############################################
#
# 模塊: putoutdata.sh
# 做者: XXXXXX
# 描述: 根據一個數據庫或表名來卸載數據並生成對應的數據文件
# 文件名爲 表名.unl
# 參數 1 = 用戶名/密碼[@實例名]
# 參數 2 = 表名
# 參數 3 = 查詢條件 "省略where"[可選]
# 參數 4 = 文件名前綴且  輸出文件名爲 前綴_表名.unl[可選]
# 參數 5 = 文件中須要替換的內容
#  有參數5時,必須配合參數4一塊兒使用 參數4 爲被替換的內容 參數5 爲替換的內容
# 例2.unload user/password rate
#   將 rate 中的所有數據導入文件中,
#     輸出文件爲 rate .unl
# 例3.unload user/password rate " code='6'"
#   將 rate 中 code= 679的數據導入文件中,
#     輸出文件爲 rate.unl
# 例4.unload user/password rate " code='6'" 9
#   將 prem_rate 中 code= 6的數據導入文件中,
#     輸出文件爲 9_rate.unl
# 例5.:unload user/password rate " pol_code='6'" 7 1
#     將 rate 中 code= 6的數據導入文件中,且將 全部6替換爲 7
#     輸出文件爲 1_rate.unlsql

##########################################數據庫

lv_sep="|" # --分隔符,能夠修改爲本身想要的分隔符,如"|"code

##獲取記錄,拼入unl文件中
f_get_records()
{
    rm -f lv_$table.txt
    SQLS2="select * from $table where 1=1 ${sqlwhere};"
    sqlplus -s ${userid} <<-!!! >/dev/null
        set colsep ${lv_sep};
        set echo off;
        set feedback off;
        set heading off;
        set pagesize 0;
        set linesize 32767;
        set termout off;
        set trimout on;
        set trimspool on;
        spool lv_$table.txt;
        ${SQLS2}
        spool off;
    !!!
    
    
    if [ -f lv_$table.txt ]
    then
    cat lv_$table.txt | grep -v "^SQL>"|sed -e "s/ *$//g"|sed "s/$/|/g"|sed -e "s/ *|/|/g"|sed -e "s/| */|/g" >${newname}${table}.unl
    if [[ `grep "ORA-" ${newname}$table.unl` = "" ]]; then
    echo "unload table ${newname}${table}....\t\t\t\t\t ok"
    else
    cat ${newname}${table}.unl
    err="$err ${newname}${table}"
    fi
    else
    echo $0 error
    fi
    rm -f lv_$table.txt
}rem

##將拼入unl文件中的特定內容替換爲指定的數據
f_fix_records()
{
    if [ -f $table.unl ]
    then
    cat $table.unl | grep ${des} |sed "s/${des}|/${newtext}|/g" >${newtext}_${table}.unl
    if [[ `grep "ORA-" $table.unl` = "" ]]; then
    echo "unload table ${table}....\t\t\t\t\t ok"
    else
    cat ${table}.unl
    err="$err ${table}"
    fi
    else
    echo $0 error
    fi
    rm -f $table.unl
}get

## 主程序入口
lv_no=$#it

case ${lv_no} in
2)##導出整張表的數據
    userid=$1
    table=$2
    f_get_records;
    ;;
3)##導出條件中的數據
    userid=$1
    table=$2
    sqlwhere=" and $3"
    newname=""
    f_get_records;
;;
4)##導出條件中的數據,並在文件前加前綴
    userid=$1
    table=$2
    sqlwhere=" and $3"
    newname="$4_"
    f_get_records;
    ##將空文件放入一個單獨文件夾
    curdir=$pwd
    if [ ! -d "$4" ];
     then
     mkdir $4;
    fi
    for file in `ls $curdir`
    do
            if [ ! -s $file ]
            then
               mv ./$file  ./$4;    
            fi        
    done    
    ;;
5)##導出條件中的數據,將文件中的特定數據替換爲指定數據
    userid=$1
    table=$2
    sqlwhere=" and $3"
    des=$4
    newtext=$5
    f_get_records;
    f_fix_records;
    ##將空文件放入一個單獨文件夾
    curdir=$pwd
        if [ ! -d "$newtext" ];
        then
            mkdir ${newtext}
        fi
    for file in `ls $curdir`
    do
            if [ ! -s $file ]
            then
               mv ./$file  ./$newtext;    
            fi        
    done
;;
*)
    echo "Usage: $0 "
    exit
    ;;
esactable

 

 

#########################################結束操做sed

if [[ "X$err" = "X" ]];then
echo "Unload Complete!,Thank you!"
else
echo "Unload Table $err error, please check it!"
fifile

相關文章
相關標籤/搜索