CREATE OR REPLACE PROCEDURE test_procedure (
)
AS 
   ***********
BEGIN
   IF ec = 'A'  //-------------------------
   THEN
      *****************
      IF *********
      THEN
         ********
         *********
      ELSE
         ***********
      END IF;
   ELSE
      //-------------------B
      *************
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      //------------------C
      *****************
      IF *********
      THEN
       **************
      END IF;
END;当EC≠'A'时,为什么不是执行B而是执行C?

解决方案 »

  1.   

    WHEN OTHERS 捕获了几乎所有的exception执行C并不意味着EC != 'A',而只说明程序执行出现EXCEPTION
      

  2.   

     
    照着楼上代码看
    IF ec = 'A'
    问题只有出现这句话上
    EC类型问题可能性最高
      

  3.   

    捕获你plsql出现的异常错误。
      

  4.   

    执行C是因为程序中出现了异常 
    出现异常的时候会从执行块中跳到异常处理块执行
    不然是不会执行C的另外 你如何判断B没有执行?也许已经执行了而你没看到呢?或者执行了一半出现异常了呢?
    最好可以把代码都贴出来看看呵呵 当然 如果出于保密性的话 那就算了
      

  5.   


    进去B去执行了,结果呢,B里面有错,就跑C那去啦!
      

  6.   

    我在DB中单步dubug这个procedure的呀,
    EC='A'时,执行B,EC≠'A'时执行C。
    所以才觉得奇怪。
      

  7.   

    CREATE OR REPLACE PROCEDURE test_procedure ( 

    AS 
      *********** 
    BEGIN 
      IF ec = 'A'  //------------------------- 
      THEN 
          ***************** 
          IF ********* 
          THEN 
            ******** 
            ********* 
          ELSE 
            *********** 
          END IF; 
      ELSE 
          //-------------------B 
          ************* 
      END IF; 
    EXCEPTION 
      WHEN OTHERS 
      THEN 
          //------------------C 
          ***************** 
          IF ********* 
          THEN 
          ************** 
          END IF; 
    END; 
    有可能在执行过程中抛出了异常。
      

  8.   

    谢谢,今天重新dubug了一次,有跳入到B里面去,但第一句select就挂了,然后转到C,
    所以,
    select a  //----在此处挂掉
    into b
    from tabel
    这句sql无符合条件的记录,此时会抛出exception吗?
      

  9.   

    Exception是表示出现了异常,才会跑到这个代码段,否则就不会进异常的代码段
      

  10.   

    异常表示代码仍然可以运行下去,不会出现什么死机或者报异常bug之类的
      

  11.   


    我的意思是:
    select a  
    into b 
    from tabel 
    如果这句sql无符合条件的记录,是否会抛出Exception?
    谢谢~
      

  12.   


    select into 语句要正确运行,必须保证有且只有一个查询结果。
    没有会抛NO_DATA_FOUND异常,多于一条会抛
    2112 错误: SELECT..INTO returns too many rows
      

  13.   


    谢谢~
    难怪SQL中有rownum=1
    还是因为偶对procedure的写法不会.
    有没有相关的书籍介绍些给偶.
    再次感谢~
      

  14.   

    oracle  10g PL/SQL 程序设计 baidu一下。
    或者 Oracle 10g PL/SQL 高级编程。
    我这暂时没有电子版
      

  15.   


    呵呵,rownum=1跟这个没有关系啦,rownum是oracle的一个伪列,用来标识行号的。