在LINUX中以SQLPLUS批次執行SQL檔
最近寫的一個範例,將來源主機的Oracle匯出的SQL檔,
以SQLPLUS批次匯入目標主機的Oracle資料庫,
並將結果輸出至螢幕並產生對應LOG。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#!/bin/ksh # ============================================== # ### SQLPLUS_BATCH_SAMPLE.sh ### # # ### LINUX下以SQLPLUS批次執行SQL檔範例 ### # # ### 2013/11/06 Edit by forink ### # # ### http://techblog.forink.net/ ### # # ### 轉貼請保留原作者與文章網址,盜文必究 ### # # ============================================== # 設定環境變數 NLS_LANG=American_America.UTF8 export NLS_LANG # Oracle帳號密碼 ACCOUNT="system" PASSWORD="my_password" # Oracle主機IP:Port TARGET_IP_PORT=127.0.0.1:1521 # 各參數設置 NOW=$(date +"%Y%m%d_%H%M%S") #取得目前時間 LOG_PATH="./RUNSQL_"${NOW}".log" #LOG位置與命名格式 BASE_SQL_DIR="TABLES/" #SQL檔路徑 LIST_FILE_NAME="RUNSQL_LIST.txt" #SQL檔案清單 (可使用ls或dir /b以'>'導出) # LOG輸出函式 function EchoLog(){ ECHO_MSG=$1 LOG_TIME=$(date +"%Y-%m-%d %H:%M:%S") echo "${LOG_TIME} ${ECHO_MSG}" | tee -a ${LOG_PATH} } # 主程式 echo if [ -f ${LIST_FILE_NAME} ] && [ -d ${BASE_SQL_DIR} ]; then EchoLog "載入SQL檔清單." saveIFS="$IFS" IFS=$'\r\n' array=($(<${LIST_FILE_NAME})) IFS="$saveIFS" if [ ${#array[@]} > 0 ]; then EchoLog "SQL清單已載入,開始批次執行." for i in "${array[@]}"; do EchoLog "開始執行 ${i}......." if [ -f ${BASE_SQL_DIR}${i} ]; then EXECUTE_RESULT=$(sqlplus ${ACCOUNT}/${PASSWORD}@${TARGET_IP_PORT} @${BASE_SQL_DIR}${i} & ) EchoLog "${EXECUTE_RESULT}" else EchoLog "指定SQL檔案: ${i} 不存在." fi ((count++)) done else EchoLog "SQL清單無資料." fi EchoLog "執行結束." else EchoLog "無法取得List清單或SQL檔路徑錯誤!" fi exit |