所以我有一个看起来像这样的文件:
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之后有多少变量(在这种情况下有四个:P_IBSP_YEAR、P_CD_PROCESSING_YEAR、P_CD_PROCESSING_MONTH、ERROR_LEVEL)
2-我想替换它们的值(出现在“:=”之后) 变量名称的前 20 个字符以百分号为界。
要记住的事情:
a) 我不知道文件中有多少变量(可能有一个或多个)
我想要的输出示例:
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 变为 %P_CD_PROCESSING_MONT% 因为它超过 20 个字符]
这是我到目前为止所拥有的。它可以工作,但它是非常静态的,因为我每次使用另一个文件时都需要修改我的脚本。因为我对变量名进行了硬编码:
@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
很抱歉这条长消息。谢谢你:)