2011-10-10 6 views
3

sqlplus 출력을 셸 스크립트로 반환하려고합니다. 이것은 충분히 간단하게 들릴지 모르지만 나는 온라인으로 몇 시간 동안 수색을 했으므로 스크립트를 작동시킬 수 없습니다. 내가 X_RETURN_CODE이 경우에도SQLPLUS가 셸 스크립트에서 값을 반환하지 않음

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

$ RETVAL는 항상 0을 반환 : 여기

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; 

내 쉘 스크립트입니다 : 여기

내 PL/SQL 스크립트 = 5

답변

6

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

감사합니다. – user965422

+0

의견과 제안을 보내 주신 모든 분들께 감사드립니다. 언제나 그렇듯이,이 포럼은 최고 중 하나입니다. – user965422

0

내 END는 블록 끝을 표시하고 X_RETURN_CODE는 범위를 벗어나 기본적으로 0으로 설정됩니다. 또는 EXIT 대신 RETURN 문을 사용해야합니다.

+0

은 당신이 올바른 것 같아요. 범위 내에서 반환 코드를 값으로 종료하려면 어떻게해야합니까? – user965422

+0

익명 블록 대신 함수 또는 프로 시저로 지정하십시오. –

0
$ 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; 
관련 문제