在“批处理脚本变量”中保存存储过程输出变量

时间:2014-07-02 15:22:30

标签: sql batch-file stored-procedures

目标:从批处理脚本运行存储过程,并将其输出变量保存到批处理脚本中的变量。

我90%在那里,但我遇到了这个问题。我有一个针对我们的数据库运行的存储过程,并根据数据库中的当前值返回1个字符的VARCHAR2 - Y或N.

调用存储过程的sql(为了安全起见,我重命名了参数和调用):

set serveroutput on
variable out_val varchar2;
exec SCHEMA.STOREDPROCEDURE('INPUT1', 'INPUT2', :out_val);
print out_val
exit

从批处理脚本调用sql文件,用于检查out_val是否设置为Y或N.我当前的批处理调用如下所示:

@echo on
set strYN = ' '

rem This line needs to store the value Y or N in a variable to be echoed at the end of the script.
for /F "usebackq" %%i in (`sqlplus schema/PW@USER @"sqlcall.sql"`) do set stryn=%%i

echo %strYN%
pause

我得到以下输出。我的批处理变量被设置为SQL连接的最后一行的第一个单词:

>set strYN = ' '
>rem ** This line needs to store the value Y or N in a variable to be echoed at the end of the script.
>for /F "usebackq" %i in (`sqlplus schema/PW@USER @"sqlcall.sql"`) do set stryn=%i
>set stryn=SQL*Plus:
>set stryn=Copyright
>set stryn=Connected
>set stryn=Oracle
>set stryn=With
>set stryn=PL/SQL
>set stryn=STOREDPROCEDURE
>set stryn=OUT_VAL
>set stryn=--------------------------------
>set stryn=N
>set stryn=Disconnected
>set stryn=With
>echo With
With
>pause
Press any key to continue . . .

相反,我希望它被设置为N.一个想法是在我的usebackq的DO部分中放置一个IF语句来检查变量是否设置为Y或N.但是,我感觉就像有一种方法,只需将out_val的值插入我的strYN Batch变量。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

假设您总是拥有与输出相同的行数:

for /F "skip=9 delims=" %%i in ('sqlplus schema/PW@USER @"sqlcall.sql"') do (
   set stryn=%%i
   goto:next)

:next
echo Stryn=%stryn%

如果没有对IF进行!stryn!测试:

setlocal enabledelayedexpansion
for /F "skip=9 delims=" %%i in ('sqlplus schema/PW@USER @"sqlcall.sql"') do (
   set stryn=%%i
   if /i "!stryn!"=="N" (goto:nextN) else (if /i "!stryn!"=="Y" goto:nextY)
)
exit /b

:nextN
echo Stryn=!Stryn!
exit /b

:nextY
echo Stryn=!Stryn!

答案 1 :(得分:0)

-S(或-Silent)选项添加到您的sqlplus通话中。

for ... in (`sqlplus -s schema/PW@USER @"sqlcall.sql"`) do ...