sql - ORA-01403 - 未找到数据 - 即使游标 SELECT 语句运行正常

标签 sql oracle plsql

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 - 未找到数据

最佳答案

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

%ROWCOUNT Attribute A cursor attribute that can be appended to the name of a cursor or cursor variable. When a cursor is opened, %ROWCOUNT is zeroed. Before the first fetch, cursor_name%ROWCOUNT returns 0. Thereafter, it returns the number of rows fetched so far. The number is incremented if the latest fetch returned a row.

代码应该是这样的:

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

关于sql - ORA-01403 - 未找到数据 - 即使游标 SELECT 语句运行正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34648743/

相关文章:

sql - 外键与辅助键

sql - PSQL : Full text search to ignore or match periods and stop characters

oracle - PLS-00201 : identifier 'D.HOLIDAY_DATE' must be declared

MYSQL 从 2 个表中选择一个 id 只在其中一个表中

mysql - sql中的交集

oracle - "IS"在 Oracle 过程中做什么?

Oracle 在更新表时挂起

sql - Oracle 查询连接日期

oracle - 在存储过程中使用 EXECUTE IMMEDIATE 执行 DML 语句

java - 如何在 Java 中执行 Oracle PLSQL block