我有一个问题,这已经花了我几天时间来解决它..
我的解释会很漫长,但我会尽量缩短它。
在我的Oracle SQLdeveloper中,我有一个包名为UT_BETWNSTR,其中包含:
create or replace
PACKAGE "UT_BETWNSTR"
IS
PROCEDURE ut_setup;
PROCEDURE ut_teardown;
PROCEDURE ut_betwnstr;
END UT_BETWNSTR;
并且包体是这样的:
create or replace
PACKAGE BODY "UT_BETWNSTR"
IS
PROCEDURE ut_setup IS
BEGIN
NULL;
END;
PROCEDURE ut_teardown
IS
BEGIN
NULL;
END;
PROCEDURE ut_BETWNSTR IS
BEGIN
utAssert.eq (
'Typical valid usage',
BETWNSTR(
STRING_IN => 'abcdefg',
START_IN => 3,
END_IN => 5)
,
'abc'
);
utAssert.isnull (
'NULL start',
BETWNSTR(
STRING_IN => 'abcdefg',
START_IN => NULL,
END_IN => 5)
);
utAssert.isnull (
'NULL end',
BETWNSTR(
STRING_IN => 'abcdefg',
START_IN => 2,
END_IN => NULL)
);
utAssert.isnull (
'End smaller than start',
BETWNSTR(
STRING_IN => 'abcdefg',
START_IN => 5,
END_IN => 2)
);
utAssert.eq (
'End larger than string length',
BETWNSTR(
STRING_IN => 'abcdefg',
START_IN => 3,
END_IN => 200)
,
'cdefg'
);
END ut_betwnstr;
END UT_BETWNSTR;
,函数名称BETWNSTR是这样的:
create or replace
FUNCTION BETWNSTR (
string_in IN VARCHAR2,
start_in IN INTEGER,
end_in IN INTEGER
)
RETURN VARCHAR2
IS
l_start PLS_INTEGER := start_in;
BEGIN
IF l_start = 0
THEN
l_start := 1;
END IF;
RETURN (SUBSTR (string_in, l_start, end_in - l_start + 1));
END;
在我的C盘中,我把文件名BETWNSTR.sql包含:
connect hr/hr
SET SERVEROUTPUT ON
EXEC UTPLSQL.TEST('BETWNSTR',Recompile_in=>FALSE);
exit
这是我的批处理文件(也在C盘中),名称为try.bat,其中包含:
@sqlplus /nolog @C:\betwnstr.sql
echo %errorlevel%
if errorlevel 0 goto Success
echo You Got Error
:Success
echo Good Job!!
pause
好的,这里出现了错误
当我运行try.bat时,它将返回大故障结果,因为我故意放
PROCEDURE ut_BETWNSTR IS
BEGIN
utAssert.eq (
'Typical valid usage',
BETWNSTR(
STRING_IN => 'abcdefg',
START_IN => 3,
END_IN => 5)
,
'abc'
);
而不是
PROCEDURE ut_BETWNSTR IS
BEGIN
utAssert.eq (
'Typical valid usage',
BETWNSTR(
STRING_IN => 'abcdefg',
START_IN => 3,
END_IN => 5)
,
'cde'
);
我是故意这样做的,所以我希望cmd会回响:
You Got Error
因为我的代码中出错了..但是错误级别是回显0,这意味着它是成功的..
我知道,我的代码现在依赖于errorlevel ..当errorlevel为0时,它将回显好工作..
我现在想要的是,当我运行批处理文件时,遇到错误时,我可以回显出你有错误信息..
当errorlevel始终显示为0时,如何回显“You Got Error”消息。
简而言之,我想在不依赖于errorlevel的情况下回显错误信息。
我希望有人为我的问题解决方案可以回答我的问题..
提前致谢!
答案 0 :(得分:3)
以前回答的所有答案都是:“我如何处理调用sqlplus的批处理文件中的错误, sqlplus在错误或失败时没有设置ERRRORLEVEL?” < / p>
但是你可以使用以下sqlplus命令实际上使用非零退出代码使sqlplus退出错误:
whenever sqlerror exit sql.sqlcode
另请参阅http://voidtech.wordpress.com/2013/03/06/execute-an-script-with-sqlplus-and-get-the-exitcode-to-the-environment/我在使用Oracle 10g的Windows机器上以这种方式使用它:
sqlplus some_user/pw@tns_name @ some_script.sql
IF %ERRORLEVEL% NEQ 0 call some_action_on_error.vbs
答案 1 :(得分:1)
我不确定这是否有效,但也许值得一试。 (我没有Windows机器,所以我无法测试,但它看起来是正确的)这将取决于sql写入标准输出的能力。我不知道Oracle,所以我不知道你能否做到这一点,但是如果可以的话,如果你知道错误/警告信息的标准模式,那么下面的小黑客应该有用。如果/ nolog停止打印到标准输出,请将其从下面的代码段中取出。值得一试。祝好运! :)
setlocal enabledelayedexpansion
some_text_signifying_error=whatever you can get sql to display to Standard Output
set msg=''
For 'eol=; tokens=1 delims=' %%e in ('@sqlplus /nolog @C:\betwnstr.sql ^| findstr /i /c:"!some_text_signifying_error!"') do (
set msg=!msg! %%e
)
if NOT !msg!='' echo !msg!