【问题标题】:ORA-01403: no data found -- Exception handling not workingORA-01403: 未找到数据 -- 异常处理不起作用
【发布时间】:2017-06-16 10:08:19
【问题描述】:
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:没有找到数据”错误而失败。我理解它为什么会失败(因为它当然没有要插入的记录),但我似乎无法找到绕过它的方法。

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

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

任何想法或建议将不胜感激。

谢谢 - 开尔文

【问题讨论】:

    标签: oracle stored-procedures oracle11g cursor


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:
       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;
      

      【讨论】:

        【解决方案3】:

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

         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 语句中解决了这个问题。见我上面的回答。
        猜你喜欢
        • 2011-11-06
        • 2021-06-19
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        • 1970-01-01
        相关资源
        最近更新 更多