从Oracle中的异常杂注提取SQLCODE

b91juud3  于 2023-03-01  发布在  Oracle
关注(0)|答案(1)|浏览(92)

我正尝试将错误作为参数传递给PL/SQL中的过程。为此,我将一个编号(错误代码)传递给该过程。在少数情况下,我尝试传递的错误是预定义的,并使用EXCEPTION_INIT命名,我希望使用该名称,但为此,我需要提取编号。
是否有办法从预定义的异常中提取编号?

-- A trivialized example of what I mean
DECLARE
  ex_bad_data    EXCEPTION;
  PRAGMA EXCEPTION_INIT(ex_bad_data, -20008);
BEGIN
  DBMS_OUTPUT.PUT_LINE('Error Code: '||get_the_err_code(ex_bad_data));
END;
    • 更新**

问题被问到"为什么"。我正试图慢慢地重构一些有"忽略异常"参数的代码。我正试图将其改为忽略指定的情况而不是一般的忽略。
所以与其说

procedure dosomething(ignore_errors boolean)

我现在有

procedure dosomething(ignore_error number)

这将允许我保留大量的调用代码,同时减少暴露于(潜在的)隐藏错误的风险。

    • 更新二**

我已经有了接受和忽略条件的代码。我希望能够使用异常名称来清楚。

procedure dosomething(ignore_error number) 
begin
  -- do stuff here
exception
  when other then
    if(sqlcode <> ignore_error)then
      raise;
    end if;
end;

当前呼叫:

dosomething(-2008);

预期呼叫:

dosometing(get_the_err_code(ex_bad_data));

以便人们清楚地知道他们忽略了什么。

a8jjtwal

a8jjtwal1#

像这样的东西有用吗?

CREATE OR REPLACE PROCEDURE p_conditionally_ignore_exception(in_ignore_error number)
AS
  unhandled_exception exception;
  var_error_number number;
BEGIN
  var_error_number := SQLCODE;
  
  IF var_error_number IS NULL -- SQLCODE may not always populate in some situations
  THEN
    var_error_number := server_error(1);      -- returns the sqlcode but with a positive sign
    var_error_number := var_error_number*-1;  -- reverse the sign to negative
  END IF;
  
  IF in_ignore_error != SQLCODE
  THEN
    RAISE unhandled_exception;
  END IF;
END;
/

-- test1
BEGIN
  execute immediate 'adf';
EXCEPTION
  WHEN OTHERS THEN
    p_conditionally_ignore_exception(-20008);
END;
/

-- test2
BEGIN
  RAISE_APPLICATION_ERROR(-20008,'This should not be seen');
EXCEPTION
  WHEN OTHERS THEN
    p_conditionally_ignore_exception(-20008);
END;
/

唯一的缺点是,这会向错误堆栈添加另一个异常。如果这是一个PL/SQL应用程序,它正在处理堆栈中更上层的某些异常,则添加一个新异常可能会使它陷入混乱。(不加栈)不能在一个即时异常处理程序之外使用,但是当然你可以让proc返回一个布尔值而不是引发一个异常,然后在你的异常处理程序中使用IF THEN,来执行一个简单的RAISE,但是你会发现,在每个异常处理程序中,有太多的proc代码重复,这就提出了这样的proc是否有用的问题。

相关问题