Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
异常在oracle plsql过程中未找到任何数据_Oracle_Stored Procedures_Exception Handling - Fatal编程技术网

异常在oracle plsql过程中未找到任何数据

异常在oracle plsql过程中未找到任何数据,oracle,stored-procedures,exception-handling,Oracle,Stored Procedures,Exception Handling,我有一个过程SET_Succession_KPI_STATUS,当我尝试运行此过程时,在SET_Succession_KPI_STATUS KPI_DEF_ID:1000206中找不到异常数据。由于这个异常,整个流程都被中断了。另一个过程正在调用过程集\后续程序\ KPI\状态,如果此过程引发异常,则另一个过程将生成问题。我不确定是否有任何方法可以捕捉到这个异常。当尝试使用KPI_DEF_ID调用时,此过程可能会返回值,或者可能包含null,因为找不到任何数据,所以我收到了错误消息。如果我从此过

我有一个过程SET_Succession_KPI_STATUS,当我尝试运行此过程时,在SET_Succession_KPI_STATUS KPI_DEF_ID:1000206中找不到异常数据。由于这个异常,整个流程都被中断了。另一个过程正在调用过程集\后续程序\ KPI\状态,如果此过程引发异常,则另一个过程将生成问题。我不确定是否有任何方法可以捕捉到这个异常。当尝试使用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;

如果没有可用的数据,则赋值将失败。而不是使用SELECT语句,考虑使用另一个游标并设置默认值。< /P> 您可能还需要检查正在使用的select语句。可能是联接表中的数据不存在,因此找不到任何要返回的数据

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

您还为查询中的参数赋值。最好将该值分配给另一个变量,并将其添加到查询之外。这样,查询就不太可能出错。

您的一些select into语句已经很好地处理了找不到的数据:

但其他人不是:

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;
如果这些选择可以合法地不返回任何行,那么您也需要处理未找到的这些行的数据:

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;

我倾向于选择一个包含适当异常处理的条目,而不是光标——因为:简洁的博客,Tony。正如我所说,我本以为会被击落-
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;