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

Oracle ORA-01403:未找到数据--异常处理不起作用,oracle,stored-procedures,oracle11g,cursor,Oracle,Stored Procedures,Oracle11g,Cursor,我的更新过程中有一个SQL语句块,它收集每条记录的交易日数,然后将其插入一个名为v_NO_of_days_RESP的整数变量中,例如通话的开放日期和响应日期之间的天数 这很好地工作,除了当有一个空的响应_日期时,ORA-01403:找不到数据错误失败。我理解它为什么会失败,因为它当然没有可插入的记录,但我似乎找不到一个绕过它的方法 在这些发现响应日期为NULL的情况下,我希望将v_NO_OF_DAYS_RESP var也设置为NULL,或者甚至以某种方式将SQL语句嵌套在IF中,以完全避免在响应

我的更新过程中有一个SQL语句块,它收集每条记录的交易日数,然后将其插入一个名为v_NO_of_days_RESP的整数变量中,例如通话的开放日期和响应日期之间的天数

这很好地工作,除了当有一个空的响应_日期时,ORA-01403:找不到数据错误失败。我理解它为什么会失败,因为它当然没有可插入的记录,但我似乎找不到一个绕过它的方法

在这些发现响应日期为NULL的情况下,我希望将v_NO_OF_DAYS_RESP var也设置为NULL,或者甚至以某种方式将SQL语句嵌套在IF中,以完全避免在响应日期为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;

    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;

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

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;

获取SELECT查询中的记录计数。然后您可以验证count=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;

获取SELECT查询中的记录计数。然后您可以验证count=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;

因此,我通过将其放在IF语句中解决了这个问题。请看我上面的答案。因此,我通过将其放在IF语句中解决了这个问题。见上面我的答案。