したがって、次のようなファイルがあります。
DECLARE
P_IBSP_YEAR VARCHAR2(32767);
P_CD_PROCESSING_YEAR VARCHAR2(32767);
P_CD_PROCESSING_MONTH VARCHAR2(32767);
ERROR_LEVEL VARCHAR2(32767);
BEGIN
P_IBSP_YEAR := NULL;
P_CD_PROCESSING_YEAR := 2013;
P_CD_PROCESSING_MONTH := January;
ERROR_LEVEL := NULL;
T2_GDA.GDA.MAIN_RUN_ALL ( P_IBSP_YEAR, P_CD_PROCESSING_YEAR, P_CD_PROCESSING_MONTH, ERROR_LEVEL );
COMMIT;
END;
1- BEGIN の後にある変数の数を知りたい (この場合、4 つの変数があります: P_IBSP_YEAR、P_CD_PROCESSING_YEAR、P_CD_PROCESSING_MONTH、ERROR_LEVEL)
2- それらの値を置き換えたい (「:=」の後に表示されるもの) ) パーセント記号で区切られた変数名の最初の 20 文字。
注意事項:
a) ファイルに含まれる変数の数が事前にわかりません (1 つ以上の変数がある可能性があります)。
私が望む出力の例:
DECLARE
P_IBSP_YEAR VARCHAR2(32767);
P_CD_PROCESSING_YEAR VARCHAR2(32767);
P_CD_PROCESSING_MONTH VARCHAR2(32767);
ERROR_LEVEL VARCHAR2(32767);
BEGIN
P_IBSP_YEAR := %P_IBSP_YEAR%;
P_CD_PROCESSING_YEAR := %P_CD_PROCESSING_YEAR%;
P_CD_PROCESSING_MONTH := %P_CD_PROCESSING_MONT%;
ERROR_LEVEL := %ERROR_LEVEL%;
T2_GDA.GDA.MAIN_RUN_ALL ( P_IBSP_YEAR, P_CD_PROCESSING_YEAR, P_CD_PROCESSING_MONTH, ERROR_LEVEL );
COMMIT;
END;
[変数 P_CD_PROCESSING_MONTH が 20 文字を超えたため %P_CD_PROCESSING_MONT% になったことに注意してください]
これが私がこれまでに持っているものです。動作しますが、別のファイルを使用するたびにスクリプトを変更する必要があるため、非常に静的です。変数名をハードコーディングしているため:
@echo off
for /f "tokens=* delims=" %%f in ('type %sql_file%') do CALL :DOREPLACE "%%f"
GOTO AFTER_FOR
:DOREPLACE
setlocal enabledelayedexpansion
SET OUTPUT_1=%*
set OUTPUT_2=!OUTPUT_1:P_IBSP_YEAR;=%P_IBSP_YEAR%; !
set OUTPUT_3=!OUTPUT_2:P_CD_PROCESSING_YEAR;=%P_CD_PROCESSING_YEAR%; !
set OUTPUT_4=!OUTPUT_3:P_CD_PROCESSING_MONTH;=%P_CD_PROCESSING_MONT%; !
set OUTPUT_5=!OUTPUT_4:ERROR_LEVEL;=%ERROR_LEVEL%; !
for /f "tokens=* delims=" %%g in ('ECHO %OUTPUT_5%') do ECHO %%~g>>%sql_file%.tmp
EXIT /b
:AFTER_FOR
echo The modified temporary sql script now looks like this
echo.
type %sql_file%.tmp
私がしたいことは、次のようになります。
元のファイルにある変数の数に基づく変数「n」が必要です。この値 n は、コマンドごとにインクリメントされます。そうすれば、今のように 1、2、3、... はありません。しかし、常に「n」
SET OUTPUT_1=%*
set OUTPUT_2=!OUTPUT_1:Full_var1_name;=%FIRST_20_CHARACTERS_OF_VAR1%;!
set OUTPUT_3=!OUTPUT_2:Full_var2_name;=%FIRST_20_CHARACTERS_OF_VAR2%; !
set OUTPUT_4=!OUTPUT_3:Full_var3_name;=%FIRST_20_CHARACTERS_OF_VAR3%; !
set OUTPUT_5=!OUTPUT_4:Full_var4_name;=%FIRST_20_CHARACTERS_OF_VAR4%; !
for /f "tokens=* delims=" %%g in ('ECHO %OUTPUT_5%') do ECHO %%~g>>%sql_file%.tmp
EXIT /b
この長いメッセージで申し訳ありません。そしてありがとうございました :)