Plsql PL/SQL异常

Plsql PL/SQL异常,plsql,oracle11g,plsqldeveloper,Plsql,Oracle11g,Plsqldeveloper,是否有方法将此错误(ORA-06502:PL/SQL:数字或值错误:字符到数字转换错误)捕获为异常?每当我使用字符串作为输入时,就会发生这种情况。我以为当其他例外会抓住它,但它不会 DECLARE v_order_no NUMBER(10) := &Order_Number; var NUMBER(10); BEGIN SELECT 1 INTO var FROM tbl WHERE col = v_order_no; EXCEPTION WHE

是否有方法将此错误(ORA-06502:PL/SQL:数字或值错误:字符到数字转换错误)捕获为异常?每当我使用字符串作为输入时,就会发生这种情况。我以为当其他例外会抓住它,但它不会

DECLARE
    v_order_no NUMBER(10) := &Order_Number;
    var NUMBER(10);
BEGIN
    SELECT 1 INTO var
    FROM tbl
    WHERE col = v_order_no;

EXCEPTION
WHEN NO_DATA_FOUND THEN
     dbms_output.put_line('ndf');
WHEN OTHERS THEN
     dbms_output.put_line('Error');
END;

正确的异常是
VALUE\u ERROR
。但是,
其他人也应该捕获该错误。代码的问题是,异常正在块的声明部分抛出。如果您在
开始
之后移动该分配,您应该能够捕获该异常

DECLARE
    v_order_no NUMBER(10);
    var NUMBER(10);
BEGIN
    v_order_no := &Order_Number;
    SELECT 1 INTO var
    FROM tbl
    WHERE col = v_order_no;

EXCEPTION
  WHEN NO_DATA_FOUND THEN
     dbms_output.put_line('ndf');
  WHEN VALUE_ERROR THEN
     dbms_output.put_line('value_error');
  WHEN OTHERS THEN
     dbms_output.put_line('Error');
END;

正确的异常是
VALUE\u ERROR
。但是,
其他人也应该捕获该错误。代码的问题是,异常正在块的声明部分抛出。如果您在
开始
之后移动该分配,您应该能够捕获该异常

DECLARE
    v_order_no NUMBER(10);
    var NUMBER(10);
BEGIN
    v_order_no := &Order_Number;
    SELECT 1 INTO var
    FROM tbl
    WHERE col = v_order_no;

EXCEPTION
  WHEN NO_DATA_FOUND THEN
     dbms_output.put_line('ndf');
  WHEN VALUE_ERROR THEN
     dbms_output.put_line('value_error');
  WHEN OTHERS THEN
     dbms_output.put_line('Error');
END;

添加一个额外的
Begin
END
块应该可以解决您的问题,并且应该捕获异常,但是@pablomatico建议的是编写块的正确方法。如果您想坚持使用自己的代码,可以按以下方式执行:

BEGIN

DECLARE
    v_order_no NUMBER(10) := &Order_Number;
    var NUMBER(10);
BEGIN
    SELECT 1 INTO var
    FROM tbl
    WHERE col = v_order_no;

EXCEPTION
WHEN NO_DATA_FOUND THEN
     dbms_output.put_line('ndf');
WHEN OTHERS THEN
     dbms_output.put_line('Error');
END;

END;

添加一个额外的
Begin
END
块应该可以解决您的问题,并且应该捕获异常,但是@pablomatico建议的是编写块的正确方法。如果您想坚持使用自己的代码,可以按以下方式执行:

BEGIN

DECLARE
    v_order_no NUMBER(10) := &Order_Number;
    var NUMBER(10);
BEGIN
    SELECT 1 INTO var
    FROM tbl
    WHERE col = v_order_no;

EXCEPTION
WHEN NO_DATA_FOUND THEN
     dbms_output.put_line('ndf');
WHEN OTHERS THEN
     dbms_output.put_line('Error');
END;

END;

我会给这个赋值分配它自己的子块,这样你就可以保证任何验证错误都来自于它,而不是代码的其他部分

我还想在单引号中加上
&order\u number
,以防它是一个字符串,可能导致无效的PL/SQL和编译错误,而不是运行时错误

declare
    v_order_no number(10);
    var        number(10);
begin
    begin
        v_order_no := '&order_number';
    exception
        when value_error then
            raise_application_error
            ( -20000, '"&order_number" is not a numeric order number', true);
    end;

    select 1 into var from dual where v_order_no > 0;
    dbms_output.put_line('var = ' || var);

exception
    when no_data_found then
        dbms_output.put_line('ndf');
end;
现在,如果您使用
order\u number=123x
运行它,则分配
v\u order\u no:=“123x”
会在以下情况下完全失败:

ORA-20000: "123x" is not a numeric order number
ORA-06512: at line 9
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
如果不加引号,则编译失败,原因是:

        v_order_no := 123x
                         *
ERROR at line 6:
ORA-06550: line 6, column 26:
PLS-00103: Encountered the symbol "X" when expecting one of the following:
* & = - + ; < / > at in is mod remainder not rem
<an exponent (**)> <> or != or ~= >= <= <> and or like like2
like4 likec between || multiset member submultiset
The symbol "; was inserted before "X" to continue.
v_订单号:=123x
*
第6行错误:
ORA-06550:第6行第26列:
PLS-00103:在预期以下情况时遇到符号“X”:
* & = - + ; < / > at in是mod余数而不是rem

或者!=或者~=>=我会给赋值赋予它自己的子块,这样你就可以保证任何验证错误都来自于它,而不是代码的其他部分

我还想在单引号中加上
&order\u number
,以防它是一个字符串,可能导致无效的PL/SQL和编译错误,而不是运行时错误

declare
    v_order_no number(10);
    var        number(10);
begin
    begin
        v_order_no := '&order_number';
    exception
        when value_error then
            raise_application_error
            ( -20000, '"&order_number" is not a numeric order number', true);
    end;

    select 1 into var from dual where v_order_no > 0;
    dbms_output.put_line('var = ' || var);

exception
    when no_data_found then
        dbms_output.put_line('ndf');
end;
现在,如果您使用
order\u number=123x
运行它,则分配
v\u order\u no:=“123x”
会在以下情况下完全失败:

ORA-20000: "123x" is not a numeric order number
ORA-06512: at line 9
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
如果不加引号,则编译失败,原因是:

        v_order_no := 123x
                         *
ERROR at line 6:
ORA-06550: line 6, column 26:
PLS-00103: Encountered the symbol "X" when expecting one of the following:
* & = - + ; < / > at in is mod remainder not rem
<an exponent (**)> <> or != or ~= >= <= <> and or like like2
like4 likec between || multiset member submultiset
The symbol "; was inserted before "X" to continue.
v_订单号:=123x
*
第6行错误:
ORA-06550:第6行第26列:
PLS-00103:在预期以下情况时遇到符号“X”:
* & = - + ; < / > at in是mod余数而不是rem
或者!=或~=>=