在平常開發中,經常會碰到使用定時任務按時跑批數據,或者其他定時操作的任務。下面就彙總整理BAT腳本編寫常用的技巧:
第一:使用BAT命令替換文件中的字符串
@echo 修改ctl控制文件內容Insert爲append 表名改爲FP_FPXX
@echo off&setlocal enabledelayedexpansion
@rem 讀取CB_FDKFPCGL_MX_sqlldr.ctl所有內容
for /f "eol=* tokens=*" %%i in (CB_FDKFPCGL_MX_sqlldr.ctl) do (
@rem 設置變量a爲每行內容
set a=%%i
@rem 如果該行有INSERT,則將其改爲APPEND
set "a=!a:INSERT=APPEND!"
@rem 把修改後的全部行存入$
echo !a!>>$)
@rem 用$的內容替換原來a.txt內容
move $ CB_FDKFPCGL_MX_sqlldr.ctl
第二:使用BAT命令操作數據SQL文件
一共分爲兩個部分:
一個爲bat批處理文件,用於sys用戶連接數據庫,並用來操作數據庫,這裏用來導入數據;
另一個爲sql文件,裏面存儲要執行的sql語句,這裏用來刪除、創建用戶。
一、爲了方便,先看sql文件:ReCreateUser.sql
-- 刪除用戶,如果沒有該用戶,第一次會報錯
drop user oa cascade;
-- 重新創建用戶oa/oa
create user oa identified oa;
-- 爲oa用戶指定默認表空間
alter user oa default tablespace users;
-- 爲oa用戶指定dba權限
grant dba to oa;
-- 提交
commit;
-- 退出
exit
二、bat文件:ImpDB.bat
@echo off
echo 連接數據庫、重新創建用戶
sqlplus sys/orcl as sysdba @ D:\ReCreateUser.sql
echo 導入數據
imp oa/oa@orcl full=y file=D:\db.dmp
echo 導入完成。
第三:使用BAT命令在一個BAT腳本中,調用其他A、B兩個BAT腳本
@echo 開始執行導出數據操作
call exp_Oracle.bat
@echo 開始執行導入數據操作
call imp_Oracle.bat
彙總樣例:
@echo off
@rem **********************************************
@rem 定時任務總調度入口
@rem 2019-03-18
@rem **********************************************
@echo off
@rem 設置路徑
set EXP_PATH=%cd%
set PATH=%PATH%;%EXP_PATH%
set ctlDir=%cd%\ctl\
call exp_Oracle.bat
@echo 修改ctl控制文件內容Insert爲append 表名改爲FP_FPXX
@echo off&setlocal enabledelayedexpansion
@rem 讀取CB_FDKFPCGL_MX_sqlldr.ctl所有內容
for /f "eol=* tokens=*" %%i in (CB_FDKFPCGL_MX_sqlldr.ctl) do (
@rem 設置變量a爲每行內容
set a=%%i
@rem 如果該行有INSERT,則將其改爲APPEND
set "a=!a:INSERT=APPEND!"
@rem 把修改後的全部行存入$
echo !a!>>$)
@rem 用$的內容替換原來a.txt內容
move $ CB_FDKFPCGL_MX_sqlldr.ctl
@echo 修改ctl控制文件內容Insert爲append 表名改爲FP_FPXX
for /f "eol=* tokens=*" %%i in (CB_FDKFPCGL_MX_sqlldr.ctl) do (
@rem 設置變量a爲每行內容
set a=%%i
@rem 如果該行有CB_FDKFPCGL_MX,則將其改爲FP_FPXX
set "a=!a:INTO TABLE CB_FDKFPCGL_MX=INTO TABLE FP_FPXX_BAK!"
@rem 把修改後的全部行存入$
echo !a!>>$)
@rem 用$的內容替換原來a.txt內容
move $ CB_FDKFPCGL_MX_sqlldr.ctl
@rem 讀取CB_FPCGL_MX_sqlldr.ctl所有內容
for /f "eol=* tokens=*" %%i in (CB_FPCGL_MX_sqlldr.ctl) do (
@rem 設置變量a爲每行內容
set a=%%i
@rem 如果該行有INSERT,則將其改爲APPEND
set "a=!a:INSERT=APPEND!"
@rem 把修改後的全部行存入$
echo !a!>>$)
@rem 用$的內容替換原來CB_FPCGL_MX_sqlldr.ctl內容
move $ CB_FPCGL_MX_sqlldr.ctl
@echo 修改ctl控制文件內容Insert爲append 表名改爲FP_FPXX
for /f "eol=* tokens=*" %%i in (CB_FPCGL_MX_sqlldr.ctl) do (
@rem 設置變量a爲每行內容
set a=%%i
@rem 如果該行有CB_FPCGL_MX,則將其改爲FP_FPXX
set "a=!a:INTO TABLE CB_FPCGL_MX=INTO TABLE FP_FPXX_BAK!"
@rem 把修改後的全部行存入$
echo !a!>>$)
@rem 用$的內容替換原來a.txt內容
move $ CB_FPCGL_MX_sqlldr.ctl
@echo 開始執行導入數據操作
call imp_Oracle.bat
@echo off
pause>nul