如何处理PL / SQL中的错误?

时间:2015-09-03 19:21:28

标签: sql oracle plsql exception-handling toad

我目前是PL / SQL的初学者,我正在学习并尝试尽可能多地吸收。我目前的任务是研究PLSQL中写入的包的错误处理。我无法理解这些软件包正在做什么以及如何处理脚本的异常/错误处理。

CREATE OR REPLACE PACKAGE BODY APMS.customer IS

PROCEDURE customer_collateral_hist(i_Vcust_cd   IN customer_collateral_history.cust_cd%TYPE,
                                   i_Vfromdate  IN customer_collateral_history.reg_dttm%TYPE,
                                   i_Vtodate    IN customer_collateral_history.reg_dttm%TYPE,
                                   i_Vauthstat  IN customer_collateral_history.auth_stat%TYPE,
                                   o_Cresultset OUT SYS_REFCURSOR)
AS
BEGIN
  OPEN o_Cresultset FOR
     SELECT auth_stat,
            buld_size,
            clos_dt,
            cnfm_dt,
            cnfm_tm,
            cnfm_user_id,
            cust_cd,
            date_seq,
            dbtr,
            dbtr_addr,
            dbtr_id,
            dbtr_tel_no,
            dbtr_zip_cd1,
            dbtr_zip_cd2,
            esta_orga,
            grnt_dt_from,
            grnt_dt_to,
            jdg_amt,
            jdg_dt,
            land_size,
            loc_addr,
            mort_amt,
            mort_chng_dt,
            mort_flag,
            mort_max_amt,
            mort_seq,
            mort_stat,
            old_key,
            ownr,
            ownr_addr,
            ownr_id,
            ownr_tel_no,
            ownr_zip_cd1,
            ownr_zip_cd2,
            prev_mort_amt,
            redm_dt,
            reg_dt,
            reg_dttm,
            reg_flag,
            reg_user_id,
            remark,
            supr_pow_flag
       FROM customer_collateral_history
      WHERE cust_cd LIKE '%'||NVL(i_Vcust_cd, cust_cd)||'%'
        AND TO_NUMBER(SUBSTR(reg_dttm, 1, 8)) >= NVL(i_Vfromdate,   TO_NUMBER(SUBSTR(reg_dttm, 1, 8)))
    AND TO_NUMBER(SUBSTR(reg_dttm, 1, 8)) <= NVL(i_Vtodate, TO_NUMBER(SUBSTR(reg_dttm, 1, 8)))
    AND auth_stat LIKE '%'||NVL(i_Vauthstat, auth_stat)||'%';
  EXCEPTION
    WHEN OTHERS THEN
       NULL;
END customer_collateral_hist;

END customer;
/

这是我正在看的包裹体。是否有人愿意帮我解决如何处理此脚本的错误&gt;目前的例外是不够的。我知道这个。

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

 EXCEPTION
    WHEN OTHERS THEN
        -- handle exception

OTHERS条款捕获了您尚未处理的每个例外

EXCEPTION
    WHEN NO_DATA_FOUND THEN
        -- handle no data found
    WHEN OTHERS THEN
        -- handle other exceptions

首先处理NO_DATA_FOUND,并在OTHERS情况下处理所有其他可能的异常。你可以尽可能多地处理

要定义自己的例外:

DEFINE
    your_exception EXCEPTION;
BEGIN
    your_queries;
    RAISE your_exception
EXCEPTION
    WHEN your_exception THEN
        your_handle
END;

答案 1 :(得分:0)

我希望有些人可能发表评论,但如果我正在编写该程序,我根本就没有异常处理程序。

一些异常处理指针。

首先,只针对你合理期望并可以做些什么的情况使用异常处理程序。

例如,如果您正在执行SELECT..INTO并且知道没有找到数据或行数过多,那么处理它们并编码您希望在每种情况下执行的操作。也许,在no_data_found的情况下使用默认值。

其次,如果您要做的就是记录它然后将其重新提升给调用者,请不要对WHEN OTHERS处理程序进行编码。作为一般规则,您应该让真正的异常(那些您没有合理预期和处理的异常)传播回调用者。

编写“永不失败”的代码很容易,如果你的意思是它永远不会抛出错误。这与编写健壮的代码不同。

在您的特定情况下,没有合理的例外情况。发生任何奇怪的事都应该由调用者来处理。抓住一个你无法做任何事情的例外是没有意义的。