错误恢复 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 Next
和 On Error Goto ErrorHandler
中包装您预期可能会失败的语句。也就是说,您将在 Begin
Exception
When Others Then
NULL;
End;
不,但您可以使用本地函数:
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 块中的子选择上的 Oracle 8i 动态 SQL 错误
使用PL/SQL连接oracle数据库,并将数据进行导出备份和导入恢复
PL/SQL 中的问题 = 错误堆栈:ORA-01403:Oracle Application Express (APEX) 中没有数据