【问题标题】:Exception No data found in oracle plsql procedure异常在 oracle plsql 过程中找不到数据
【发布时间】:2015-12-11 12:50:38
【问题描述】:

我有程序SET_SUCCESSOR_KPI_STATUS,当我尝试运行此程序时,我收到Exception NO_DATA_FOUND in SET_SUCCESSOR_KPI_STATUS KPI_DEF_ID: 1000206 的异常。由于这个异常,整个流程被打乱了。过程SET_SUCCESSOR_KPI_STATUS 正在被另一个过程调用,如果此过程引发异常,则另一个过程将产生问题。我不确定是否有任何方法可以捕获此异常。当尝试使用KPI_DEF_ID 调用时,此过程可能会返回值,或者它可能包含 null ,因为没有找到数据,所以我收到错误消息。如果我从这个过程中删除异常处理并运行它,那么它会在其他一些过程中显示错误,但主要原因是在这个过程中。

PROCEDURE SET_SUCCESSOR_KPI_STATUS
-- PUBLIC
(
  IN_KPI_DEF_ID IN NUMBER DEFAULT 0
, IN_KPI_STATUS IN CHAR DEFAULT 'N'
, RET OUT Number
) IS

EV Number := 0;
SUCC Number := 0;
PARENTS_GREEN Number := 1;
SUCC_KPI_ACTIVE_INITIAL CHAR;
SUCC_KPI_ACTIVE_CURRENT CHAR;    
BEGIN   

SELECT KD.EVENT_ID INTO EV FROM RATOR_MONITORING_CONFIGURATION.KPI_DEFINITION KD WHERE KD.KPI_DEF_ID = IN_KPI_DEF_ID;   

BEGIN
SELECT E.EVENT_SUCCESSOR_ID INTO SUCC FROM RATOR_MONITORING_CONFIGURATION.EVENT_SUCCESSOR E JOIN RATOR_MONITORING_CONFIGURATION.EVENT IN_EVENT ON E.EVENT_ID = IN_EVENT.EVENT_ID WHERE E.EVENT_ID = EV;
EXCEPTION WHEN NO_DATA_FOUND THEN
SUCC := 0;
END;

WHILE SUCC > 0
LOOP
SELECT KPI_ACTIVE_CURRENT INTO SUCC_KPI_ACTIVE_CURRENT from RATOR_MONITORING_CONFIGURATION.KPI_DEFINITION KD WHERE KD.EVENT_ID =  SUCC;
SELECT KPI_ACTIVE_INITIAL INTO SUCC_KPI_ACTIVE_INITIAL from RATOR_MONITORING_CONFIGURATION.KPI_DEFINITION KD WHERE KD.EVENT_ID =  SUCC;

UPDATE RATOR_MONITORING_CONFIGURATION.KPI_DEFINITION KD
SET KD.KPI_ACTIVE_CURRENT = CASE WHEN IN_KPI_STATUS = 'Y' AND (SELECT MONITORING.ARE_PARENTS_GREEN(KD.KPI_DEF_ID) FROM DUAL) = 1 AND SUCC_KPI_ACTIVE_CURRENT <> SUCC_KPI_ACTIVE_INITIAL THEN KD.KPI_ACTIVE_INITIAL WHEN IN_KPI_STATUS = 'N' AND (SUCC_KPI_ACTIVE_CURRENT <> SUCC_KPI_ACTIVE_INITIAL) THEN IN_KPI_STATUS ELSE KD.KPI_ACTIVE_CURRENT END,
KD.LAST_UPDATED_BY = 115,
KD.LAST_UPDATED_DATE = CURRENT_DATE
WHERE KD.EVENT_ID =  SUCC;

BEGIN
SELECT E.EVENT_SUCCESSOR_ID INTO SUCC FROM RATOR_MONITORING_CONFIGURATION.EVENT_SUCCESSOR E JOIN RATOR_MONITORING_CONFIGURATION.EVENT IN_EVENT ON E.EVENT_ID = IN_EVENT.EVENT_ID WHERE E.EVENT_ID = SUCC;
EXCEPTION WHEN NO_DATA_FOUND THEN
SUCC := 0;
END;

END LOOP;

RET := 1;

EXCEPTION WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Exception NO_DATA_FOUND in SET_SUCCESSOR_KPI_STATUS KPI_DEF_ID: '||TO_CHAR(IN_KPI_DEF_ID));
RET := 1;
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Exception OTHERS in SET_SUCCESSOR_KPI_STATUS KPI_DEF_ID: '||TO_CHAR(IN_KPI_DEF_ID));
RET := 0;
RAISE;

END SET_SUCCESSOR_KPI_STATUS;

【问题讨论】:

    标签: oracle stored-procedures exception-handling


    【解决方案1】:

    您的一些select into 语句已经很好地处理NO_DATA_FOUND

    BEGIN
    SELECT E.EVENT_SUCCESSOR_ID INTO SUCC FROM RATOR_MONITORING_CONFIGURATION.EVENT_SUCCESSOR E JOIN RATOR_MONITORING_CONFIGURATION.EVENT IN_EVENT ON E.EVENT_ID = IN_EVENT.EVENT_ID WHERE E.EVENT_ID = EV;
    EXCEPTION WHEN NO_DATA_FOUND THEN
    SUCC := 0;
    END;
    

    但其他人不是:

    SELECT KPI_ACTIVE_CURRENT INTO SUCC_KPI_ACTIVE_CURRENT from RATOR_MONITORING_CONFIGURATION.KPI_DEFINITION KD WHERE KD.EVENT_ID =  SUCC;
    SELECT KPI_ACTIVE_INITIAL INTO SUCC_KPI_ACTIVE_INITIAL from RATOR_MONITORING_CONFIGURATION.KPI_DEFINITION KD WHERE KD.EVENT_ID =  SUCC;
    

    如果这些选择可以合法地不返回任何行,那么您也需要为这些处理 NO_DATA_FOUND

    BEGIN
       SELECT KPI_ACTIVE_CURRENT INTO SUCC_KPI_ACTIVE_CURRENT
       from RATOR_MONITORING_CONFIGURATION.KPI_DEFINITION KD
       WHERE KD.EVENT_ID =  SUCC;
    EXCEPTION
       WHEN NO_DATA_FOUND THEN
         -- Do what?
         NULL;
    END;
    
    BEGIN
       SELECT KPI_ACTIVE_INITIAL INTO SUCC_KPI_ACTIVE_INITIAL
       from RATOR_MONITORING_CONFIGURATION.KPI_DEFINITION KD
       WHERE KD.EVENT_ID =  SUCC;
    EXCEPTION
       WHEN NO_DATA_FOUND THEN
         -- Do what?
         NULL;
    END;
    

    【讨论】:

      【解决方案2】:

      如果没有可用数据,则赋值失败。考虑使用另一个游标并设置默认值,而不是使用 SELECT INTO 语句。

      您可能还想检查您正在使用的选择语句。可能是连接表中的数据不存在,所以找不到要返回的数据。

      我希望为此被击落,但我会嵌套一个光标以使用 SUCC 值作为参数来获取此数据。

      您还为查询中的参数赋值。最好将值分配给另一个变量并将更新从查询中添加出来。这样查询就不太可能出错。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 2019-11-16
      • 1970-01-01
      相关资源
      最近更新 更多