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 := 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  

この長いメッセージで申し訳ありません。そしてありがとうございました :)

4

1 に答える 1

0

検索してGNU sedで置換

@echo オフセット&セットローカル
「qfile=file.sql」を設定します

「tfile=%temp%\%random%.tmp」を設定
( for /f %%i in ('sed -n "/DECLARE/, /BEGIN/ s/\(.*\)\s\w.*/\1/ p" "%qfile%"') do (
    「行=%%i」を設定
    setlocal enableddelayedexpansion
    set "line=!line:~0,20!"
    echo(%%i !行!
    エンドローカル
))>"%tfile%"
for /f "usebackqtokens=1,2" %%i in ("%tfile%") do sed -i "/BEGIN/, $ s/%%i :=.*/%%i := %%%% j%%;/" "%qfile%"
デル "%tfile%"
「%qfile%」と入力

.. 出力は次のとおりです。

宣言する
  P_IBSP_YEAR VARCHAR2(32767);
  P_CD_PROCESSING_YEAR VARCHAR2(32767);
  P_CD_PROCESSING_MONTH VARCHAR2(32767);
  ERROR_LEVEL VARCHAR2(32767);

始める
  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 );
  専念;
終わり;
于 2013-05-27T18:13:49.050 に答える