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/