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 语句运行良好的主要内容,如果未能解决你的问题,请参考以下文章