错误恢复 PL/SQL oracle 中的下一种错误处理类型

Posted

技术标签:

【中文标题】错误恢复 PL/SQL oracle 中的下一种错误处理类型【英文标题】:On error resume next type of error handling in PL/SQL oracle 【发布时间】:2014-05-28 13:45:03 【问题描述】:

就像 VB 编码中的 On Error Resume Next 一样,PL/SQL 有没有办法做到这一点

我有一个选择语句序列,所以当no data found 抛出异常而不是begin exception 块时,有没有办法移动到下一个语句

Eg

    select Name into l_name1 from TEMP_TBL where T=1 and R='2';
    select Name into l_name1 from TEMP_TBL where T=33 and R='3';
    select Name into l_name1 from TEMP_TBL where T=11 and R='4';
    select Name into l_name1 from TEMP_TBL where T=2 and R='5';
    select Name into l_name1 from TEMP_TBL where T=4 and R='6';

所以而不是

begin
select Name into l_name1 from TEMP_TBL where T=1 and R='2';
exception
when no_data_found then
null
end;

有没有一种简单的方法可以移动到下一个语句

【问题讨论】:

据我所知,在这方面没有办法让 PL/SQL 像 VB 一样工作。祝你好运。 我也研究过,似乎简短的回答是“不”。对于我们这些具有经典 VB 经验的人来说,Oracle 解决方案相当于 VB,它相当于在 On Error Resume NextOn Error Goto ErrorHandler 中包装您预期可能会失败的语句。也就是说,您将在 Begin Exception When Others Then NULL; End; 中包装您期望可能失败的 Oracle 语句 【参考方案1】:

不,但您可以使用本地函数:

declare
   l_name1 temp_tbl.name%type;
   function get_name
      ( p_t number
      , p_r varchar2
      ) return varchar2
   is
      l_name temp_tbl.name%type;
   begin
      select Name into l_name from TEMP_TBL where T=p_t and R=p_r;
      return l_name;
   exception    
      when no_data_found then
         return null;
   end;
begin
   l_name1 := get_name (1, '2');
   l_name1 := get_name (33, '3');
   l_name1 := get_name (11, '4');
   l_name1 := get_name (2, '5');
   l_name1 := get_name (4, '6');
end;

【讨论】:

【参考方案2】:

假设您的陈述问题在您的示例中被忽略了。我会使用 Tony 的答案,但您也可以使用聚合函数:

select decode(count(*), 1, max(Name)) into l_name1 from TEMP_TBL where T=1 and R='2';
select decode(count(*), 1, max(Name)) into l_name1 from TEMP_TBL where T=33 and R='3';
select decode(count(*), 1, max(Name)) into l_name1 from TEMP_TBL where T=11 and R='4';
select decode(count(*), 1, max(Name)) into l_name1 from TEMP_TBL where T=2 and R='5';
select decode(count(*), 1, max(Name)) into l_name1 from TEMP_TBL where T=4 and R='6';

对于没有 1 且只有 1 行的 (T,R) 的任何实例,此方法将返回 null。

【讨论】:

以上是关于错误恢复 PL/SQL oracle 中的下一种错误处理类型的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 使用 EXEC_SQL Oracle 表单 6i 获取下一条和上一条记录

Oracle:使用 SQL 或 PL/SQL 查找动态 SQL 中的错误位置

PL/SQL 异常错误处理

pl/sql 块中的子选择上的 Oracle 8i 动态 SQL 错误

使用PL/SQL连接oracle数据库,并将数据进行导出备份和导入恢复

PL/SQL 中的问题 = 错误堆栈:ORA-01403:Oracle Application Express (APEX) 中没有数据