我在程序中有两个选择语句(客户,产品)。
我的代码看起来像这样,
begin
....begin
....select xxxxx from customer
....exception
....when no_data_found then
....raise_application....(xxx1,'no customer found');
....end
select xxxxx from product
exception
when no_data_found then
raise_application....(xxx2,'no product found')
when others then
raise_application....(xxx3,sqlerrm);
end
没有找到产品时没有问题,
但问题是没有客户ID时, 因为它执行两个异常xxx1,xxx3但我只希望它执行xxx1然后退出程序。我出于某种原因需要xxx3异常,所以我想保留它。
你们有什么想法吗?
答案 0 :(得分:1)
此代码正是您正在告诉它的行为。在第一个块中,您会收到NO_DATA_FOUND
个异常,NO_DATA_FOUND
的异常处理程序会引发您的xxx1
异常。然后触发外部异常块中的WHEN OTHERS
处理程序,因为您没有异常xxx1
的特定处理程序,并且此WHEN OTHERS
处理程序会引发您的xxx3
异常。
如果您希望在引发xxx1
异常后退出该过程,则需要在外部异常块中编写一个处理程序来执行此操作:
begin
....begin
....select xxxxx from customer
....exception
....when no_data_found then
....raise_application....(xxx1,'no customer found');
....end
select xxxxx from product
exception
when no_data_found then
raise_application....(xxx2,'no product found')
WHEN xxx1 THEN -- added
RETURN;
when others then
raise_application....(xxx3,sqlerrm);
end
如果你想重新引发xxx1
异常以便它可以在程序之外被捕获,那么你需要在异常处理程序中使用RAISE
而不是return:
begin
....begin
....select xxxxx from customer
....exception
....when no_data_found then
....raise_application....(xxx1,'no customer found');
....end
select xxxxx from product
exception
when no_data_found then
raise_application....(xxx2,'no product found')
WHEN xxx1 THEN -- added
RAISE; -- will re-raise the xxx1 exception so it can be handled elsewhere
when others then
raise_application....(xxx3,sqlerrm);
end
分享并享受。