想在PL / SQL中使用no_data_found两次

时间:2015-03-15 14:09:46

标签: plsql

我在程序中有两个选择语句(客户,产品)。

我的代码看起来像这样,

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异常,所以我想保留它。

你们有什么想法吗?

1 个答案:

答案 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

分享并享受。