@ECHO OFF
SETLOCAL
SET "list="
FOR /f %%i IN (driversql.txt) DO (
CALL SET list=%%list%% "%%i"
)
ECHO sqlplus uname/pwd@"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=XXXXXX) (PORT=1521)))(CONNECT_DATA=(SID=XXXXX)))"%list%
我相信我们需要知道的是如何SQLPLUS
运作。
上面的代码所做的是将所有文件名累积到一个列表中,用空格分隔并引用。它可能会起作用 - 一切都取决于您将如何级联操作 sql1.sql 然后 sql2.sql ...使用一个SQLPLUS
命令
那么,如果能够控制哪些 [set of] SQL 文件被执行,以及以什么顺序执行呢?
我假设您可以简单地将 .SQL 文件连接成一个如果不是这种情况,那么现在停止阅读......
@ECHO OFF
SETLOCAL
:tloop
SET tempfile=%RANDOM%
IF EXIST "%temp%\%tempfile%*" GOTO tloop
COPY NUL "%temp%\%tempfile%.1" >nul
FOR /f %%s IN (sqlsched.txt) DO (
FOR /f "tokens=1,2" %%i IN (%%s) DO (
FINDSTR /i /b /e /c:"%%i" "%temp%\%tempfile%.1" >nul
IF ERRORLEVEL 1 (SET "excludeme=") ELSE (SET excludeme=Y)
IF /i "%%j"=="again" (SET "excludeme=")
IF NOT DEFINED excludeme (>>"%temp%\%tempfile%.1" ECHO %%i)
)
)
TYPE "%temp%\%tempfile%.1"
(
FOR /f "delims=" %%i IN ('type "%temp%\%tempfile%.1"') DO type %%i
)>humungous.sql
DEL "%temp%\%tempfile%.1"
假设我们有一个文件 SQLSCHED.TXT,内容
daily1.txt
special.txt
daily2.txt
weekly1.txt
例如 daily2.txt 包含
D0S9.sql
D2S1.sql
D0S0.sql
D2S1.sql
D0S9.sql again
然后这批将首先读取sqlsched.txt
然后处理每个文件daily1.txt
, special.txt
, daily2.txt
,weekly1.txt
依次生成一个临时文件。
然后逐行读取临时文件将生成humungous.sql
包含提到的每个 sql 文件的所有内容。你所要做的就是sqlplus
使用humungous.sql
我已经包含了一些技巧 - 如果您在humungous.sql
构建时重复其中一个 SQL 文件名,那么该过程只包含一次,因此在daily2.txt
列表中,第二个D2S1.sql
将被跳过。但是,由于该标志D0S9.sql
,将第二次运行。again
如果需要,这可以扩展 - 例如,如果您在变量中有当前的日期名称,那么您可以添加该行
IF /i NOT "%%j"=="%dayname%" (SET "excludeme=Y")
和线
dWdX.sql Wed
确保WdX.sql
只能在星期三运行