Как мне обработать ошибки в пакетном файле, который вызывает sqlplus, потому что sqlplus не устанавливает ERRRORLEVEL в случае ошибки или сбоя? - PullRequest
1 голос
/ 02 декабря 2011

У меня есть проблема, которая уже заняла у меня несколько дней, чтобы ее решить ..

Мое объяснение будет довольно длинным, но я пытаюсь сделать его коротким.иметь имя пакета 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, он вернет большой результат FAILURE, поскольку я намеренно поставил

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, что означает успех..

я знаю, мой код теперь зависит от уровня ошибки .. когда уровень ошибки равен 0, он будет отображаться как Good Job ..

что яхочу прямо сейчас, когда я запускаю командный файл, когда он сталкивается с ошибкой, я могу вывести сообщение You Got Error ..

как я могу вывести сообщение "You Got Error", когда уровень ошибки всегдакороче говоря 0 ..

, я хочу отобразить сообщение об ошибке независимо от уровня ошибки ..

Я надеюсь, что кто-нибудь может решить мою проблему, пожалуйста, ответьте на мой вопрос ..1041 *

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 30 января 2014

Все предыдущие ответы отвечали: "Как мне обрабатывать ошибки в пакетном файле, который вызывает sqlplus, , когда sqlplus не устанавливает ERRRORLEVEL в случае ошибки или сбоя?"

Но вы можете на самом деле завершить работу 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/ Я использую его таким образом на машине Windows с Oracle 10g:

sqlplus some_user/pw@tns_name @ some_script.sql
IF %ERRORLEVEL% NEQ 0 call some_action_on_error.vbs
1 голос
/ 02 декабря 2011

Я не уверен, сработает ли это, но, возможно, оно того стоит.(У меня нет машины с 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!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...