一、PLSQL异常处理
     异常是由ORACLE错误或显式的抛出一个错误产生的。
     如何处理:
     用一个处理程序来捕获它;
     将它传递给CALLING ENVIRONMENT
    二、异常的类型:
     ORACLE SERVER 预定义错误
     非ORACLE SERVER 预定义错误,但也是ORACLE SERVER 的标准错误
     用户自定义异常
    三、捕捉异常的要点:
    Place the WHEN OTHERS clause after all other exception handling clauses.

    You can have at most one WHEN OTHERS clause.

     Begin exception-handling section of the block with the keyword EXCEPTION.

   Define several exception handlers, each with their own set of actions, for the
block.

     When an exception occurs, PL/SQL will process only one handler before leaving
the block.
    EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
statement1;
    四、常用错误:
     NO_DATA_FOUND ORA-01403
     TOO_MANY_ROWS ORA-01422
     INVALID_CURSOR ORA-01001
     ZERO_DIVIDE ORA-01476
     DUP_VAL_ON_INDEX ORA-00001
    五、实例
    PROCEDURE elim_inventory
(v_product_id IN s_product.id%TYPE) IS
v_id s_product.id%TYPE;
BEGIN
SELECT id
INTO v_id
FROM s_product
WHERE id = v_product_id;
DELETE FROM s_inventory
WHERE product_id = v_product_id;
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
ROLLBACK;
TEXT_IO.PUT_LINE(TO_CHAR(v_product_id)||
’ is invalid.’);
WHEN TOO_MANY_ROWS THEN
ROLLBACK;
TEXT_IO.PUT_LINE(’Data corruption in S_PRODUCT.’);
WHEN OTHERS THEN
ROLLBACK;
TEXT_IO.PUT_LINE(’Other error occurred.’);
END elim_inventory;
      在SCOTT环境中使用要稍加改动
    六、使用non-predefined Oracle7 Server error
    DECLARE
       E_PRO   EXCEPTION;
       PRAGMA EXCEPTION_INIT(E_PRO,ERROR_NUMBER);
    BEGIN
   ......
     EXCEPTION
      WHEN E_PRO THEN
       DBMS_OUTPUT.PUT_LINE('ASDLKFJKASDJFASJDFLKASDF');
      ......
    END;
    七、用户自定义
    exception EXCEPTION;
   RAISE exception;
    EXCEPTION
      WHEN E_PRO THEN
       DBMS_OUTPUT.PUT_LINE('ASDLKFJKASDJFASJDFLKASDF');
      ......
    END;
     这里,只有用户自定义异常是要显式声明的,其他两个不用。
    在SUN OS5.8中,进行SVRMGRL> OERR ORA 01840  可返回信息
    或查错误代码:
    HTTP://TECHNET.ORACLE.COM/DOC/SERVER.815/A67785/E1500.HTM
    
    题外话,create public database link otlink connect to system identified
    by manager using 'oratest';
    
    说回来,以下两个函数:
   SQLCODE ----Returns the numeric value for the error code. You can assign it
to a NUMBER variable.
   SQLERRM ----Returns character data containing the message associated with
the error number.
    一般这样,
   EXCEPTION
     ... WHEN OTHERS THEN
            ROLLBACK;
            v_error_code:=SQLCODE;
            V_ERROR_MESSAGE:=SQLERRM;
            INSERT INTO ........
      END;
    八、调用外围环境
    SQLPLUS  
    PROCEDURE BUILDER
    DEVELOPER 2000
    OTHER .........
    ---- 也就是把ERROR NUMBER和MESSAGE输出到SCREEN。
    九、使用RAISE_APPLICATION_ERROR
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        RAISE_APPLICATION_ERROR(-20201,'NO MATCH RECORD YOU WANNA');
END;
    当然,RAISE_APPLICATION_ERRO也是可以放在EXECUTE区的,IF  THEN
                   RAISE_APPLICATION_ERRO();
              END IF;
    这也是很好理解。
  

解决方案 »

  1.   

    你还是使用execute immediate,效率高,而且好用
      

  2.   

    execute immediate 不错。Cause: This error message is from the parser. It found a token  (language element) that is 
    inappropriate in this context.Action: Check previous tokens as well as the one given in the error message. The line and column 
    numbers given in the error message refer to the end of the faulty language construct
      

  3.   

    好了。自己解决了。
    多谢谢各位。
    送分。
    其实,只是因为我以前没有花时间去研究oracle,上上周是被逼要搞oracle的一些问题--因为项目组没有人能够做oracle的了,只好我自己来--。还好,经过一周的看书、查资料,写了许多过程与job,现在嘛,已经可以吹牛了,哈哈。
    结果,上周五,oracle数据库给跨了,出现了ora-01200错误(没见过吧)。
    嘿嘿,折腾一下午了,终于摆平了。
      

  4.   

    问题还是我自己来解决吧:
    Q1:
    dbms_sql.parse(cursor_name,strSQL,dbms_sql...)中的  
    strSQL超过255,  
    如何处理?  
    A:没办法,dbms_sql.parse(...)中的strSQL可以超过256,只要不超过32767就可以的。
    至于为什么会出现问题,那是在调试的时候,会调用dbms_output.put_line,这时的参数不能大于256个字符。--当然有些调试工具会解决这一个问题的。如果自己想将strsql输出在screen上,那时就不能用dmbs_output了,只能自己写一个过程(在过程中调用,dbms_output)set  serveroutput  on  size  1000000;  
    只能是对sql plus的设置