0

我有一个带有编号类型输入参数的存储过程。

CREATE OR REPLACE PROCEDURE my_procedure (p_x number) 
AS

我包含如下异常处理代码,但不处理以下代码:

execute my_procedure ('sads')

EXCEPTION
    WHEN VALUE_ERROR THEN
        DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);

有什么办法可以改变错误论点的例外吗?

4

1 回答 1

0

错误将在调用过程时发生,而不是在过程内部发生,因此您无法在该过程本身内将错误捕获为异常。一个可能的解决方案是使用验证参数的附加过程。在下面的示例代码中,该过程接受 VARCHAR2,但仅当参数实际上是数字so_arg_test.my_procedure时才会调用。my_procedure_hidden对于其他任何事情,它都会引发值错误。

CREATE OR REPLACE PACKAGE so_arg_test AS
  PROCEDURE my_procedure (
    p_x IN VARCHAR2
  );

END so_arg_test;
/

CREATE OR REPLACE
PACKAGE BODY SO_ARG_TEST AS

  procedure my_procedure_hidden  (p_x IN NUMBER) AS
  BEGIN
    -- your code
    dbms_output.put_line('Inside my_procedure_hidden');
  END my_procedure_hidden;
  
  procedure my_procedure (p_x IN VARCHAR2) 
  AS  
  BEGIN
    IF VALIDATE_CONVERSION(p_x AS NUMBER) = 0 THEN
      RAISE VALUE_ERROR;
    END IF;
    my_procedure_hidden (p_x => my_procedure.p_x);
  END my_procedure;  

END SO_ARG_TEST;
/
于 2021-12-18T12:58:21.370 回答