2011-10-10 126 views
3

我试图返回一个sqlplus输出到shell脚本。这听起来很简单,但我在网上搜索了一段时间,无法让我的脚本正常工作。SQLPLUS输出到shell脚本不返回值

这里是我的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; 

这里是我的shell脚本:

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

$ RETVAL总是返回0,即使我有X_RETURN_CODE:= 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

我guess是END标记块的结束,X_RETURN_CODE超出范围,所以它默认为0.或者,你应该看看使用RETURN语句,而不是EXIT。

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