【问题标题】:ORA-01403 - no data found -- even though cursor SELECT statement is running fineORA-01403 - 未找到数据 - 即使游标 SELECT 语句运行良好
【发布时间】:2016-01-07 06:35:42
【问题描述】:
declare
CURSOR C1 IS
    Select to_date(DateRange,'dd-mm-rrrr') DateRange 
    from (select to_date('01-JAN-2016','DD-MON-RRRR') - 1 + level as DateRange
      from    DUAL
      where   (TO_DATE('01-JAN-2016', 'DD-MON-RRRR') - 1 + level) <= LAST_DAY(TO_DATE('31-DEC-2016', 'DD-MON-RRRR'))
      connect by level<=366)
where substr(to_char(DateRange,'DAY'),1,3) in ('SUN','SAT');
begin
   if not c1%ISopen
      then
      open C1;
end if;
  dbms_output.put_line("Cursor is created and number of affected rows are: " || c1%rowcount);
  close c1;
end;
/

即使在创建光标中使用的 select 语句运行良好,但是当我尝试执行代码时,它会抛出错误 -- ORA-01403 - 找不到数据

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    您打开游标,但不获取它。 来自文档:

    %ROWCOUNT 属性 可以附加到 游标或游标变量的名称。打开游标时, %ROWCOUNT 清零。在第一次提取之前,cursor_name%ROWCOUNT 返回 0。此后,它返回到目前为止提取的行数。 如果最新的 fetch 返回一行,则该数字会增加。

    代码应该是这样的:

    DECLARE
       CURSOR C1
       IS
          SELECT TO_DATE (DateRange, 'dd-mm-rrrr') DateRange
            FROM (    SELECT TO_DATE ('01-JAN-2016', 'DD-MON-RRRR') - 1 + LEVEL
                                AS DateRange
                        FROM DUAL
                       WHERE (TO_DATE ('01-JAN-2016', 'DD-MON-RRRR') - 1 + LEVEL) <=
                                LAST_DAY (TO_DATE ('31-DEC-2016', 'DD-MON-RRRR'))
                  CONNECT BY LEVEL <= 366)
           WHERE SUBSTR (TO_CHAR (DateRange, 'DAY'), 1, 3) IN ('SUN', 'SAT');
    
       a   DATE;
    BEGIN
       IF NOT c1%ISOPEN
       THEN
          OPEN C1;
       END IF;
    
       LOOP
          FETCH c1 INTO a;
    
          EXIT WHEN C1%NOTFOUND;
       END LOOP;
    
       DBMS_OUTPUT.put_line (
          'Cursor is created and number of affected rows are: ' || c1%ROWCOUNT);
    
       CLOSE c1;
    END;
    /
    

    【讨论】:

      【解决方案2】:

      您的选择语句不正确。将to_date 替换为to_char。

      declare
      CURSOR C1 IS
          select to_char(DateRange,'dd-mm-rrrr') DateRange   --replaced to_date with to_char
          from 
            (
              select to_date('01-JAN-2016','DD-MON-RRRR') - 1 + level as DateRange
              from    DUAL
              where   (TO_DATE('01-JAN-2016', 'DD-MON-RRRR') - 1 + level) <= LAST_DAY(TO_DATE('31-DEC-2016', 'DD-MON-RRRR'))
              connect by level<=366
            )
          where substr(to_char(DateRange,'DAY'),1,3) in ('SUN','SAT');
      begin
         if not c1%ISopen
            then
            open C1;
      end if;
        dbms_output.put_line("Cursor is created and number of affected rows are: " || c1%rowcount);
        close c1;
      end;
      /
      

      从内部查询中,您返回了 date,但在主要的 select 子句中,您在 date 上使用了 to_date,这可能是您没有得到所需结果的原因。

      【讨论】:

      • 嗨@Utsav .. 感谢您的回复。但是我已经一一检查了选择语句,即我检查了内部查询,然后检查了完整的查询,它运行良好。
      • 不可能。尝试运行一次完整的选择查询。它会给出错误。然后尝试将最外层的to_date 替换为to_char,就像我在示例中给出的那样,然后再次查看。你会明白我在说什么
      • 我正在运行以下查询并且工作正常: Select to_date(DateRange,'dd-mm-rrrr') DateRange from (select to_date('01-JAN-2016','DD-MON -RRRR') - 1 + 级别作为 DUAL 的 DateRange 其中 (TO_DATE('01-JAN-2016', 'DD-MON-RRRR') - 1 + 级别)
      • 我在办公室所以不能做太多事情。正如我在回答中提到的那样,尝试将最外层的 to_date 替换为 to_char,然后再次创建您的 pl/sql 块。如果您仍然遇到错误,请告诉我。
      • 我认为你没有得到它.. 我已经多次告诉我我的 SELECT 语句工作正常.. 如果您对光标错误有任何想法,请告诉我.. 否则没有问题..感谢您的帮助..
      猜你喜欢
      • 1970-01-01
      • 2022-01-19
      • 2015-12-31
      • 2014-03-28
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 2011-11-06
      相关资源
      最近更新 更多