簡體   English   中英

如何處理PL / SQL中的錯誤?

[英]How to handle errors in PL/SQL?

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

這是我正在查看的包主體。 是否有人願意幫助我解決該腳本的錯誤>當前的異常不足。 我知道很多。

任何幫助表示贊賞。

 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;

我希望有人會發表評論,但是如果我正在編寫該過程,則根本不會有異常處理程序。

一些異常處理的指針。

首先,僅將異常處理程序用於您合理預期並可以采取措施的情況。

例如,如果您正在執行SELECT..INTO並且知道沒有發現數據或行太多,則可以對它們進行處理並編寫每種情況下的操作代碼。 也許在no_data_found的情況下使用默認值。

其次,如果您要做的就是記錄WHEN OTHERS處理程序,然后將其重新引發給調用方,則不要編寫代碼。 通常,應該讓真正的異常(您沒有合理預期和處理的異常)傳播回調用者。

編寫“永不失敗”的代碼很容易,只要您所要表達的意思就是它永遠不會引發錯誤。 那與編寫健壯的代碼不同。

在您的特定情況下,沒有合理的例外可以期待。 發生的任何奇怪的事情都應該交給調用者處理。 捕獲一個您無能為力的異常沒有任何意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM