ORA-01403:未找到数据 - 异常处理无法正常工作

时间:2017-01-31 04:30:40

标签: oracle stored-procedures oracle11g cursor

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块,它收集每条记录的交易日数,然后将其插入名为&#34; v_NO_OF_DAYS_RESP&#34;的整数变量中。例如通话开启和回复日期之间的天数。

这种方法很有效,除非有空的&#34; RESPONSE_DATE&#34; &#34; ORA-01403失败的地方:没有找到数据&#34;错误。我明白为什么它失败了(因为它当然没有记录要插入)但我似乎无法想办法绕过它。

在这些情况下,&#34; RESPONSE_DATE&#34;发现是NULL,我想要&#34; v_NO_OF_DAYS_RESP&#34; var也被设置为NULL(甚至以某种方式将SQL语句嵌套在&#34; IF&#34;当&#34; RESPONSE_DATE&#34;为NULL时可能完全避免运行计算(SQL语句))

*说得非常简单,我想要以下内容:..如果调用还没有响应日期,要么不运行SQL语句(计算),要么只将var设置为Null

非常感谢任何想法或建议。

谢谢 - 凯文

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;

答案 2 :(得分:0)

获取SELECT查询中的记录数。然后您可以进行验证(计数是否为0)。您可以尝试这样操作。

result VARCHAR2(100);
result_count NUMBER;
BEGIN
   SELECT count(<COLUMN_NAME>) INTO result_count FROM <TABLE_NAME> where empid = 12;
   IF result_coun = 0 THEN 
      result := 'Value does not exist in the reference table';
   END IF;
END;