【问题标题】:oracle pl/sql exception handling for input parameter (bad argument i.e. non numeric value for number)输入参数的 oracle pl/sql 异常处理(错误参数,即数字的非数值)
【发布时间】:2022-01-20 18:09:49
【问题描述】:

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

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);

有没有办法改变错误参数的异常?

【问题讨论】:

  • 异常出现在调用代码中,而不是您的过程中,因此您的过程永远不会看到无效值,也无法处理它。

标签: exception plsql input-parameters


【解决方案1】:

错误将在调用过程时发生,而不是在过程内部发生,因此您无法在该过程本身内将错误捕获为异常。一个可能的解决方案是使用验证参数的附加过程。在下面的示例代码中,过程so_arg_test.my_procedure 接受一个VARCHAR2,但如果参数实际上是一个数字,它只会调用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;
/

【讨论】:

    猜你喜欢
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多