ORA-01403: 未找到数据 -- 异常处理不起作用

ORA-01403: no data found -- Exception handling not working

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" 的整数变量中,例如呼叫打开和响应日期之间的天数。

除了出现空 "RESPONSE_DATE" 并出现 "ORA-01403: no data found" 错误而失败时,此方法运行良好。我明白为什么它会失败(因为它当然没有要插入的记录)但我似乎无法找到解决它的方法。

在发现 "RESPONSE_DATE" 为 NULL 的情况下,我希望 "v_NO_OF_DAYS_RESP" var 也设置为 NULL(或者甚至以某种方式嵌套 SQL 语句在 "IF" 中可能完全避免 运行 在 "RESPONSE_DATE" 为 NULL 时计算(SQL 语句)。

*为了简单起见,我想要以下内容:.. 如果电话还没有回复日期,要么不要 运行 SQL 声明(计算)或只需将 var 设置为 Null

如有任何想法或建议,我们将不胜感激。

谢谢 - 开尔文

处理异常将解决您的问题:

 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;
 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;

获取 SELECT 查询中的记录数。然后你可以验证(count=0 or not)。你可以这样试试。

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;