再SQL/PlUS中执行下面的命令
想测试一下返回哪个值.可是执行的时候, 遇见EXIT命令,自动退出了.有没有办法看到返回的值.
WHENEVER SQLERROR exit 1declare
TYPE test_rec IS RECORD(
Code VARCHAR2(10),
Name VARCHAR2(30) NOT NULL := 'book');
V_book test_rec;
CURSOR c_sal IS SELECT empno, ename, sal FROM emp ;BEGIN V_book.code := '123';
V_book.name := 'C++ Programming';
DBMS_OUTPUT.PUT_LINE(v_book.code || v_book.name);
BEGIN
FOR v_sal IN c_sal LOOP
DBMS_OUTPUT.put_line( to_char(v_sal.empno)||'---'|| v_sal.ename||'---'|| to_char(v_sal.sal));
END LOOP;
DBMS_OUTPUT.PUT_LINE(1/0);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('error');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('发生其它错误!');
exit 99;
END;
END;
exit 0;
想测试一下返回哪个值.可是执行的时候, 遇见EXIT命令,自动退出了.有没有办法看到返回的值.
WHENEVER SQLERROR exit 1declare
TYPE test_rec IS RECORD(
Code VARCHAR2(10),
Name VARCHAR2(30) NOT NULL := 'book');
V_book test_rec;
CURSOR c_sal IS SELECT empno, ename, sal FROM emp ;BEGIN V_book.code := '123';
V_book.name := 'C++ Programming';
DBMS_OUTPUT.PUT_LINE(v_book.code || v_book.name);
BEGIN
FOR v_sal IN c_sal LOOP
DBMS_OUTPUT.put_line( to_char(v_sal.empno)||'---'|| v_sal.ename||'---'|| to_char(v_sal.sal));
END LOOP;
DBMS_OUTPUT.PUT_LINE(1/0);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('error');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('发生其它错误!');
exit 99;
END;
END;
exit 0;
如,
c:\>sqlplus system @t.sql
c:\>echo %errorlevel%在 linux 下可以使用 echo $? 查看脚本执行完毕后的返回值。
-----------------------------------------
通过测试,以上的做法不行。
在PLSQL中,【 EXCEPTION
WHEN NO_DATA_FOUND THEN EXIT 99】 不能被编译通过。
--------------------------------------------
如果用WHENEVER和EXCEPTION组合,例如:
WHENEVER SQLERROR exit 99
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('。。');只会执行EXCEPTION的内容,不会执行【WHENEVER SQLERROR exit 1】的处理。
----------------------------------------------------------------------
我想在出异常的时候,用DBMS_OUTPUT.PUT_LINE出力一些信息, 并且返回“99” 给调用的SHELL。
有没有什么好的办法
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.put_line('error');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('发生其它错误!');
exit 99;
这段代码本身在 sql 脚本中就是错误,exit 命令是 sqlplus 特有的命令,不能用于 plsql 块中。因此,sql 脚本返回的不是 1/0 的错误,而是 exception 块中的错误。要让 sql 脚本可以返回 plsql 语句的错误,就必须让这个错误可以被接收到。
如,t.sql 脚本whenever sqlerror exit 1begin
dbms_output.put_line(1/0);
exception when others then
dbms_output.put_line('Error.');
raise; -- 抛出
end;
/exit 0
c:\>sqlplus system @t.sql
c:\>echo %ERRORLEVEL%
1