Вывод SQLPLUS в сценарий оболочки не возвращает значение

#oracle

#Oracle

Вопрос:

Я пытаюсь вернуть вывод 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

Ответ №1:

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
  

Комментарии:

1. Спасибо всем за ваши комментарии и предложения. Как всегда, этот форум один из лучших.

Ответ №2:

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

Комментарии:

1. Я думаю, вы правы. Как я могу получить свой код возврата в области видимости для завершения с его значением?

2. Сделайте это функцией или процедурой вместо анонимного блока.

Ответ №3:

 $ 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;