将EXEC命令作为变量传递给.sql

时间:2014-07-09 15:12:04

标签: sql oracle batch-file stored-procedures

当前状态: 我有一个批处理脚本(mybatch.bat),它通过.sql文件(file.sql)调用存储过程,并且当前将三个变量传递给它 - 存储过程和两个参数。 .sql当前基于此存储过程输出变量:

file.sql

set serveroutput on
variable out_val varchar2;
exec &1('&2', '&3', :out_val);
print out_val
exit

mybatch.bat

set procedure=%1
set param1=%2
set param2=%3
set strYN = ' '

rem ** This line stores out_val value Y or N as strYN.
for /F "usebackq" %%i in (`sqlplus database/pw@user @"file.sql" %procedure% %param1% %param2%`) do (
    set stryn=%%i
    if /I "!strYN!"=="N" (goto:nextN) else (if /I "!strYN!"=="Y" goto:nextY)
)

问题: 我希望能够从同一个.sql文件调用其他存储过程,该文件可能具有输出变量(out_val)。所以我希望能够连接我的批处理中的执行行并将其作为变量传递给.sql

未来状态: 我希望能够将整个命令作为变量传递到我的.sql中,如下所示:

file.sql

set serveroutput on
variable out_val varchar2;
exec &1
print out_val
exit

mybatch.bat

set procedure=%1
set param1=%2
set param2=%3
set strYN = ' '
set command=%procedure%('%param1%', '%param2%', :out_val);

rem ** This line stores out_val value Y or N as strYN.
for /F "usebackq" %%i in (`sqlplus database/pw@user @"file.sql" %command%`) do (
    set stryn=%%i
    if /I "!strYN!"=="N" (goto:nextN) else (if /I "!strYN!"=="Y" goto:nextY)
)

这可能吗?或者.sql变量只能用作参数?也许有一个sql函数接受变量作为要执行的行?

1 个答案:

答案 0 :(得分:1)

事实证明问题是关于我的%命令%变量值的末尾的分号。我从变量的值中删除了分号,并将其添加到.sql文件中的exec命令的末尾。我还将%命令%参数传递包含在引号中,因为变量包含空格。

file.sql

set serveroutput on
variable out_val varchar2;
exec &1;
print out_val
exit

mybatch.bat

set procedure=%1
set param1=%2
set param2=%3
set strYN = ' '
set command=%procedure%('%param1%', '%param2%', :out_val)

rem ** This line stores out_val value Y or N as strYN.
for /F "usebackq" %%i in (`sqlplus database/pw@user @"file.sql" "%command%"`) do (
    set stryn=%%i
    if /I "!strYN!"=="N" (goto:nextN) else (if /I "!strYN!"=="Y" goto:nextY)
)