再SQL/PlUS中执行下面的命令
想测试一下返回哪个值.可是执行的时候, 遇见EXIT命令,自动退出了.有没有办法看到返回的值.
WHENEVER SQLERROR exit 1
declare
  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;

解决方案 »

  1.   

    其实是用SHELL调用PL/SQL,因为没有UNIX环境,所以想用 SQL/PlUS 来测试一下返回值。高手有什么好的办法嘛
      

  2.   

    在 windows 的命令行下使用 sqlplus 执行完 sql 脚本后,可以使用 echo %errorlevel% 查看返回值。
    如,
    c:\>sqlplus system @t.sql
    c:\>echo %errorlevel%在 linux 下可以使用 echo $? 查看脚本执行完毕后的返回值。
      

  3.   

    谢谢楼上的回答。
    -----------------------------------------
    通过测试,以上的做法不行。
    在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。
    有没有什么好的办法
      

  4.   

     EXCEPTION
      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
      

  5.   

    谢谢  xman_78tom 的回答。 当发生异常1返回的时候, 打印的信息【 dbms_output.put_line('Error.');】 如何能查看的到。我想得到的结果是, 打印的ERROR信息和返回值“1”. 
      

  6.   

    自定义的错误信息与 oracle 的错误信息都显示在一起。