1

我们有 30 多个 Oracle 查询文件,其中包含存储过程和 SQL 查询。

我试图通过创建一个批处理脚本来自动化该过程,该脚本调用包含文件名的文本文件“driverssql.txt”。下面是批处理脚本:

@echo off
setlocal enabledelayedexpansion
 >output.txt
 ( for /f %%a in (driversql.txt) do (
    sqlplus uname/pwd@"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=XXXXXX) (PORT=1521)))(CONNECT_DATA=(SID=XXXXX)))"  "%%a"
 ))

上面的脚本执行得很好,但问题是每次脚本循环时,它都会创建一个连接,这是一种浪费,而不是处理这个问题的最佳方法。

当我将连接置于循环之外时,连接成功,但之后 SQLPlus 窗口处于挂起状态并且不执行查询。请提出一个更好的方法来实现这一点。

4

1 回答 1

0
@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只能在星期三运行

于 2013-04-15T16:44:43.347 回答