2015-12-11 3 views
0

У меня есть процедура SET_SUCCESSOR_KPI_STATUS, для которой, когда я пытаюсь запустить эту процедуру, я получаю исключение как Exception NO_DATA_FOUND in SET_SUCCESSOR_KPI_STATUS KPI_DEF_ID: 1000206. Из-за этого исключения весь поток нарушается. Процедура SET_SUCCESSOR_KPI_STATUS вызывается другой процедурой, и если эта процедура вызывает исключение, другая процедура создает проблему. Я не уверен, есть ли способ поймать это исключение. При попытке позвонить с помощью KPI_DEF_ID эта процедура может возвращать значения или может содержать нуль, для которого я получаю ошибку, поскольку данные не найдены. Если я удаляю обработку исключений из этой процедуры и запускаю ее, тогда она показывает ошибку в некоторых других процедурах, но основная причина в этой процедуре.Исключение данных в oracle Процедура plsql

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; 

ответ

2

Некоторые из ваших 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; 
+0

спасибо, что это работает для меня – Andrew

0

Если данных нет, присваивание значения не удастся. Вместо использования инструкции SELECT INTO рассмотрите возможность использования другого курсора и установки значения по умолчанию.

Вы также можете проверить выбранный оператор, который вы используете. Может быть, данные в объединенной таблице не существуют, поэтому не будут возвращены какие-либо данные.

Я ожидаю, что для этого сниму, но я бы ввел курсор, чтобы получить эти данные, используя значение SUCC в качестве аргумента.

Вы также назначаете значение аргументу в запросе. Было бы лучше назначить значение другой переменной и добавить обновление из запроса. Таким образом, запрос будет менее склонным к самовыражению.

+0

Я бы предпочел ' выберите в 'с правильной обработкой исключений по курсору - потому что: http://tonyandrews.blogspot.co.uk/2011/04/curse-of-cursor.html –

+1

Ясный блог, Тони. Как я уже сказал, я ожидал, что меня сбивают. :-) – Hooloovoo

Смежные вопросы