如何处理调用sqlplus的批处理文件中的错误,因为sqlplus在出错或失败时没有设置ERRRORLEVEL?

时间:2011-12-02 01:20:17

标签: batch-file sqlplus

我有一个问题,这已经花了我几天时间来解决它..

我的解释会很漫长,但我会尽量缩短它。

在我的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的情况下回显错误信息。

我希望有人为我的问题解决方案可以回答我的问题..

提前致谢!

2 个答案:

答案 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!