環境が最近更新され、変更が消去された場合に、ユーザーが環境にコードを少し再デプロイするために使用できる簡単なバッチ スクリプトを作成しようとしています。
スクリプトはうまく機能しますが、希望どおりにログを記録していません。展開プロセスの制限に従ってください (私は DBA ではなく、単なる開発者です)。ファイルに ECHO コマンドを含めることはできません。
これを回避するために、バッチ スクリプトの一部として、「SET ECHO ON」コマンドと「SPOOL file.log APPEND」コマンドを含むlogin.sqlファイルを作業ディレクトリに作成します。目標は、これがスクリプトの前に実行され、出力をスプールすることでした。ただし、SPOOL コマンドは機能しているように見えますが、スクリプトの内容は ECHO されていません。
バッチ スクリプトの関連コードは次のとおりです。
:: Identify all files that begin with a number and end with .sql and write to a file.
dir /b *.sql | findstr /b "[0-9]" > ScriptsToImplement.txt
:: Show the user the files to be executed and confirm whether to proceed
echo The following scripts will be executed in %DB%:
for /f "delims=" %%i in (ScriptsToImplement.txt) do echo %%i
echo:
set /p PROCEED=Proceed with implementation? [y/n] ^>
if /i "%PROCEED%" NEQ "y" (goto :opt_to_terminate)
:: Build the user profile SQL file that will be executed after logging into SQLPlus
:: This allows for the spooling of the output without having the SPOOL command declared in the file.
echo SET ECHO ON >> login.sql
echo SPOOL %DB%~%FOLDER%~%DATESTAMP%.log APPEND >> login.sql
:: Go through the SQL files in the text file and execute them in the specified database.
for /f "delims=" %%i in (ScriptsToImplement.txt) do (
echo exit | sqlplus -L -S %DB_USER%/%DB_PASS%@%DB% @%%i
if %errorlevel% NEQ 0 (@echo an error occurred with applying %%i; stopping further script execution... & pause & goto :terminate) else (@echo %%i was applied successfully) >> %DATESTAMP%_run_all.log
)
私の理解では、これは個別のスクリプトごとに個別の SQL*Plus セッションを起動しているため、毎回 login.sql ファイルを呼び出しているため、毎回 SET ECHO ON コマンドを使用する必要があります。