Вывод SQLPLUS в сценарий оболочки не возвращает значение - PullRequest
3 голосов
/ 10 октября 2011

Я пытаюсь вернуть вывод sqlplus в сценарий оболочки. Это может показаться достаточно простым, но я некоторое время искал в Интернете и не могу заставить мой скрипт работать.

Вот мой скрипт pl / sql:

SET SERVEROUTPUT ON

DECLARE 
X_RETURN_MSG VARCHAR2(32767);
X_RETURN_CODE NUMBER;

BEGIN 
X_RETURN_MSG := NULL;
X_RETURN_CODE := 5;

COMMIT;
END;

EXIT X_RETURN_CODE;

Вот мой скрипт:

sqlplus -s user/pwd <<EOF
@../sql/tester.sql
EOF
RETVAL=$?
echo $RETVAL

$ RETVAL всегда возвращает 0, даже если у меня есть X_RETURN_CODE: = 5

Ответы [ 3 ]

6 голосов
/ 10 октября 2011

X_RETURN_CODE не имеет смысла вне области блока PL / SQL, где он объявлен.Вам необходимо использовать переменную связывания SQLPlus.

SQL> VARIABLE return_code NUMBER
SQL> BEGIN
  2    :return_code := 5;
  3  END;
  4  /

PL/SQL procedure successfully completed.

SQL> EXIT :return_code
Disconnected from Oracle Database 10g Release 10.2.0.4.0 - Production
> echo $?
5
0 голосов
/ 10 октября 2011
$ sqlplus -s <<!
> / as sysdba
> @tester
> !

PL/SQL procedure successfully completed.

$ echo $?
5

$ cat tester.sql
SET SERVEROUTPUT ON

var X_RETURN_CODE number

DECLARE
X_RETURN_MSG VARCHAR2(32767);

BEGIN
X_RETURN_MSG := NULL;
:X_RETURN_CODE := 5;

COMMIT;
END;
/

EXIT :X_RETURN_CODE;
0 голосов
/ 10 октября 2011

Я предполагаю, что END обозначает конец блока, а X_RETURN_CODE выходит за пределы области видимости, поэтому по умолчанию он равен 0. Или, возможно, вам следует использовать оператор RETURN вместо EXIT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...