PL/SQL 没有发现游标的数据异常

Posted

技术标签:

【中文标题】PL/SQL 没有发现游标的数据异常【英文标题】:PL/SQL no data found exception with cursors 【发布时间】:2013-06-23 14:54:34 【问题描述】:

我正在编写一个打开 2 个游标的过程,并且需要为每个游标执行一些逻辑,但如果 no_data_found 则不执行任何操作。 如果我不处理它,则 fetch 插入 null 值,如果我抛出异常,它会忽略第二部分。

代码:

create or replace procedure pro_name(param1,param2....)
as
    var1
    var2
    TYPE cur_typ IS REF CURSOR;
    c cur_typ;
    etc...
begin
sql_str := 'select from ' || param1 || 'where some_cond..';

open c for sql_str;
loop

fetch c into v1, v2 , v3; 
DO STUFF...

end loop;
commit;


-- go all over again with different table

sql_str2 := 'select from ' || param2 || 'where some_cond..';

open c2 for sql_str2;
loop

fetch c into v1a, v2a , v3a; 
DO STUFF...

end loop;
commit;

end;

我应该把错误处理放在哪里?

【问题讨论】:

为什么其中任何一个都会返回no_data_found 异常?从不返回任何行的游标中获取数据不是错误。我的猜测是,您正在考虑编写必须准确返回 1 行的 SELECT ... INTO 时会发生什么。 我不知道。我打开游标,当使用 v1、v2 和 v3 时,它们都有空值,因为 sql_str 不返回任何行。我怎样才能跳过执行第一个DO STUFF ?... 你是说查询没有返回任何行?或者它返回所有三列都是NULL 的行?如果查询没有返回任何行,您只需将EXIT 放在DO STUFF 之前。 exit when c%notfound; @EgorSkriptunoff,是这样的语法吗?当 c%notfound 时退出?只退出循环? 【参考方案1】:

当 fetch 未找到任何行时,您需要退出循环(请参阅 Working with Cursors):

FETCH c INTO v1, v2, v3; 
EXIT WHEN c%NOTFOUND;

【讨论】:

以上是关于PL/SQL 没有发现游标的数据异常的主要内容,如果未能解决你的问题,请参考以下文章

Oracle笔记4-pl/sql-分支/循环/游标/异常/存储/调用/触发器

Oralce-PL/SQL编程-游标

PL/SQL 异常 ORA-06511 游标已打开

PL/SQL轻量版——游标与异常处理

PL/SQL - 声明带有由其他游标填充的表的游标时出错

zbb20170601 oracle PL/SQL 语句块 游标 自定义游标 异常处理EXCEPTION