【问题标题】:How to handle errors in PL/SQL?如何处理 PL/SQL 中的错误?
【发布时间】:2015-11-29 18:32:51
【问题描述】:

我目前是 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;
/

这是我正在查看的包体。是否有人愿意帮助我了解如何处理此脚本的错误> 当前的异常是不够的。我知道的就这么多。

感谢任何帮助。

【问题讨论】:

  • 并非所有代码都在代码块中。你能再缩进一级吗?
  • 我会完全删除异常处理程序。处理您实际可以处理的异常,让其余的传播到调用者。也许捕获异常,将异常记录到表中,然后重新抛出异常是有意义的。但作为第一步,我将摆脱任何您无法执行特定操作来处理特定错误的异常处理程序。
  • 很抱歉,我说过我是 PLSQL 的新手。我的导师/上级要求我处理所有包中的错误,这就是其中之一。为什么这没有异常处理程序?不是所有的包都应该有异常/错误处理程序吗?
  • EXCEPTION WHEN OTHERS THEN NULL; 等于“无论发生什么,都忽略它。”我认为只有在极少数情况下你才会喜欢这种行为。

标签: sql oracle plsql exception-handling toad


【解决方案1】:
 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;

【讨论】:

    【解决方案2】:

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

    一些异常处理的指针。

    首先,仅在您合理预期并且可以采取措施的情况下使用异常处理程序。

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

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

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

    在您的特定情况下,不存在合理的例外情况。发生任何奇怪的事情都应该交给调用者处理。捕获你无能为力的异常是没有意义的。

    【讨论】:

    • 非常感谢,这里的每个人都帮了很多忙。我只是新手。我在大学里做过基本的数据库设计,但是 PLSQL 很难掌握。我被告知要对程序进行错误处理,但它们都有相同的异常句柄。啊,我需要学习这些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 2013-07-23
    相关资源
    最近更新 更多