ORA-01403 - 未找到数据 - 即使游标 SELECT 语句运行良好

Posted

技术标签:

【中文标题】ORA-01403 - 未找到数据 - 即使游标 SELECT 语句运行良好【英文标题】:ORA-01403 - no data found -- even though cursor SELECT statement is running fine 【发布时间】: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 - 找不到数据

【问题讨论】:

【参考方案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 语句工作正常.. 如果您对光标错误有任何想法,请告诉我.. 否则没有问题..感谢您的帮助..

以上是关于ORA-01403 - 未找到数据 - 即使游标 SELECT 语句运行良好的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL 触发器 ORA 01403 未找到数据

Oracle PL/SQL - ORA-01403 使用“SELECT INTO”时“未找到数据”

01403. 00000 - “未找到数据”

触发错误:ORA-01403 插入时找不到数据

ORA-01403: no data found

ORA-01403 找不到数据错误