2017-01-31 4 views
1
BEGIN 
FOR v_LoadRec IN c_Load LOOP 
    SELECT count(1) INTO v_NO_OF_DAYS_RESP 
    from  DIM_DATE 
    where DIM_DATE.TRADING_DAY_FLAG = 'Y' and 
      DIM_DATE_KEY <= TO_NUMBER(TO_CHAR(v_LoadRec.RESPONSE_DATE,'YYYYMMDD')) and 
      DIM_DATE_KEY >= TO_NUMBER(TO_CHAR(v_LoadRec.OPEN_DATE, 'YYYYMMDD')) 
    group by v_LoadRec.CALL_NUMBER; 
    IF SQL%NOTFOUND THEN 
    v_NO_OF_DAYS_RESP :=''; 
    END IF; 

    SELECT count(1) INTO v_NO_OF_DAYS_RESO 
    from  DIM_DATE 
    where DIM_DATE.TRADING_DAY_FLAG = 'Y' and 
     DIM_DATE_KEY <= TO_NUMBER(TO_CHAR(v_LoadRec.RESOLVE_DATE,'YYYYMMDD')) and 
     DIM_DATE_KEY >= TO_NUMBER(TO_CHAR(v_LoadRec.OPEN_DATE, 'YYYYMMDD')) 
    group by v_LoadRec.CALL_NUMBER; 
    IF SQL%NOTFOUND THEN 
    v_NO_OF_DAYS_RESO :=''; 
    END IF; 

END LOOP; 

У меня есть этот блок SQL в моей процедуре обновления, собирающий счетчик торговых дней для каждой записи, а затем вставляет его в целочисленную переменную с именем «v_NO_OF_DAYS_RESP Exception "например количество дней между открытой и ответной датой вызова.ORA-01403: нет данных найдено - обработка не работает

Это хорошо работает, за исключением случаев, когда есть нулевое «RESPONSE_DATE», где он не работает с ошибкой «ORA-01403: нет данных». Я понимаю, почему он терпит неудачу (потому что он, конечно, не имеет записи для вставки), но я не могу понять, как его обойти.

В этих обстоятельствах, когда «RESPONSE_DATE» признано NULL, я хотел бы, чтобы параметр «v_NO_OF_DAYS_RESP» был установлен равным NULL (или даже каким-то образом имеет инструкцию SQL, вложенную в «IF», ​​чтобы, возможно, полностью избежать запуск вычисления (оператор SQL), когда значение RESPONSE_DATE равно NULL).

* Для того, чтобы поместить это действительно просто, я хочу следующее: .. Если вызов еще не имеет дату ответа, либо не запускать SQL заявление (расчет) или просто установить вар обнулить

Любые идеи или предложения были бы весьма признательны.

Спасибо - Кельвин

ответ

0
if (v_LoadRec.RESPONSE_DATE) is null Then 
    v_NO_OF_DAYS_RESP:=''; 
else 
    SELECT  count(1) INTO v_NO_OF_DAYS_RESP 
    from DIM_DATE 
    where DIM_DATE.TRADING_DAY_FLAG = 'Y' and 
     DIM_DATE_KEY <= TO_NUMBER(TO_CHAR(v_LoadRec.RESPONSE_DATE, 'YYYYMMDD')) and 
     DIM_DATE_KEY >= TO_NUMBER(TO_CHAR(v_LoadRec.OPEN_DATE, 'YYYYMMDD')) 
    group by v_LoadRec.CALL_NUMBER; 
    IF SQL%NOTFOUND THEN 
     v_NO_OF_DAYS_RESP :=''; 
    END IF; 
end if; 
0

Обработка исключений решит вашу проблему:

BEGIN 
FOR v_LoadRec IN c_Load LOOP 
    SELECT count(1) INTO v_NO_OF_DAYS_RESP 
    from  DIM_DATE 
    where DIM_DATE.TRADING_DAY_FLAG = 'Y' and 
      DIM_DATE_KEY <= TO_NUMBER(TO_CHAR(v_LoadRec.RESPONSE_DATE,'YYYYMMDD')) and 
      DIM_DATE_KEY >= TO_NUMBER(TO_CHAR(v_LoadRec.OPEN_DATE, 'YYYYMMDD')) 
    group by v_LoadRec.CALL_NUMBER; 
    IF SQL%NOTFOUND THEN 
    v_NO_OF_DAYS_RESP :=''; 
    END IF; 
END LOOP; 
EXCEPTION 
WHEN NO_DATA_FOUND THEN 
v_NO_OF_DAYS_RESP :=''; 
END; 
+0

Так что я решил проблему, поставив его в операторе IF. См. Мой ответ выше. – Kelvin