实际上,可能不会。
您可以有一个异常处理程序,但您将不知道哪一步失败了。您可能会从错误堆栈中获取错误的行号,然后解析来自dba_source 的数据(假设您确实有一个存储过程而不是匿名 PL/SQL 块)以找到该语句。但这是一项繁重的工作。
Declare
l_smtp_hostname varchar2(1024);
l_smtp_port varchar2(1024);
l_music_db_site varchar2(1024);
Begin
Select lu_value into l_smtp_hostname from mail_lookup
Where lu_type = 'smtp_hostname';
Select lu_value into l_smtp_port from mail_lookup
Where lu_type = 'smtp_port';
Select lu_value into l_music_db_site from mail_lookup
Where lu_type = 'music_db_site';
Exception
When no_data_found
Then
<<do something>>
End;
您可以添加一个变量来跟踪您在流程中的位置。这可行,但可能会导致一些丑陋的代码
Declare
l_smtp_hostname varchar2(1024);
l_smtp_port varchar2(1024);
l_music_db_site varchar2(1024);
l_tracker varchar2(30);
Begin
l_tracker := 'smtp_hostname';
Select lu_value into l_smtp_hostname from mail_lookup
Where lu_type = l_tracker;
l_tracker := 'smtp_port';
Select lu_value into l_smtp_port from mail_lookup
Where lu_type = l_tracker;
l_tracker := 'music_db_site';
Select lu_value into l_music_db_site from mail_lookup
Where lu_type = l_tracker;
Exception
When no_data_found
Then
dbms_output.put_line( 'Error at ' || l_tracker );
<<do something>>
End;
大多数情况下,您希望分别处理每个异常。通常通过调用记录错误的过程。
Declare
l_smtp_hostname varchar2(1024);
l_smtp_port varchar2(1024);
l_music_db_site varchar2(1024);
Begin
begin
Select lu_value into l_smtp_hostname from mail_lookup
Where lu_type = 'smtp_hostname';
exception
when no_data_found then
log_error( 'smtp_hostname', <<other parameters>> );
end;
begin
Select lu_value into l_smtp_port from mail_lookup
Where lu_type = 'smtp_port';
exception
when no_data_found then
log_error( 'smtp_port', <<other parameters>> );
end;
begin
Select lu_value into l_music_db_site from mail_lookup
Where lu_type = 'music_db_site';
exception
when no_data_found then
log_error( 'music_db_site', <<other parameters>> );
end;
End;
当然,您可以将该代码分解为一个函数,该函数接受 lu_type 并返回 lu_value,而不是复制代码块中的代码。
Declare
l_smtp_hostname varchar2(1024);
l_smtp_port varchar2(1024);
l_music_db_site varchar2(1024);
function get_lu_value( p_lu_type in mail_lookup.lu_type%type )
return mail_lookup.lu_value%type
is
l_val mail_lookup.lu_value%type;
begin
select lu_value
into l_val
from mail_lookup
where lu_type = p_lu_type;
return l_val;
exception
when no_data_found
then
<<do something>>
end;
Begin
l_smtp_hostname := get_lu_value( 'smtp_hostname' );
l_smtp_port := get_lu_value( 'smtp_port' );
l_music_db_site := get_lu_value( 'music_db_site' );
End;