PL / SQL value_error异常未被捕获

时间:2018-01-18 05:22:58

标签: oracle exception plsql

这是我的部门表:

create table Department(
    DeptNo int primary key, 
    DeptName varchar2(21) not null, 
    DeptLocation varchar2(13) not null
);

我正在尝试为DeptName列插入长度超过接受的值,即21,这意味着我应该得到" VALUE_ERROR"例外。 我正在运行的plsql代码是:

begin
    insert into department values(1, 'Some random department name', 'SomeLocation');
exception
    when value_error then
        dbms_output.put_line('Cannot store the value!');
end;

当我试图捕捉异常时,它并没有被抓住。我收到了错误:

  

ORA-12899:值太大而不能列#34; SQL_ZIRHWMLFPCEAKPGYGJJZLSIFI"。" DEPARTMENT"。" DEPTNAME" (实际:27,最大值:21)ORA-06512:第2行   ORA-06512:在" SYS.DBMS_SQL",第1721行

但是,如果我从" value_error"更改我的异常到"其他人"

begin
    insert into department values(1, 'Some random department name', 'SomeLocation');
exception
    when others then
        dbms_output.put_line('Cannot store the value!');
end;

然后我得到预期的输出

  

无法存储值!

我哪里可能出错了?请告诉我。谢谢!

PS:我正在运行livesql.oracle.com上的所有代码

2 个答案:

答案 0 :(得分:1)

理想情况下,您使用的是正确的,它应该按照需要运行。但是异常VALUE_ERROR在某些情况下表现不同。请参阅以下说明性示例。

  

根据文档value_error出现时有   发生算术,转换,截断或大小约束错误。   例如,当您的程序在字符中选择列值时   变量,如果值超过声明的长度   变量,PL / SQL中止赋值并引发VALUE_ERROR。在   程序语句,如果转换a,则引发VALUE_ERROR   字符串转换为数字失败。

最后一行说,在过程语句中,如果将字符串转换为数字失败,则会引发VALUE_ERROR。,但是当我在一个块中运行它时,它会抛出INVALID_NUMBER异常。

SQL> declare
  2    n number;
  3  begin
  4    select to_number('a')
  5      into n
  6      from dual
  7    ;
  8  exception
  9    when value_error
 10    then
 11      dbms_output.put_line ('Value Error');
 12    when invalid_number
 13    then
 14      dbms_output.put_line ('Invalid Number');
 15  end;
 16  /
Invalid Number

PL/SQL procedure successfully completed.

我预计它会提高VALUE_ERROR,但它没有。因此,Oracle可能无法在您的情况下提升value_error,并且当您使用WHEN OTHERS时,它被捕获了。

编辑:

  

确定。所以有可能以某种方式通过给予来捕获value_error异常   值的长度超过变量的声明长度?

系统异常的明确提升:不是很优雅,但您可以按照以下方式执行此操作。

declare

var int;
var1 varchar2(21);
var2 varchar2(13);

begin

var1:='Some random department name';
var2:= 'SomeLocation'

If var1 > 21 then
 RAISE VALUE_ERROR; 
END IF; 

If var2 > 13 then
 RAISE VALUE_ERROR; 
END IF; 

insert into department values(1, var1, var2);

exception
    when value_error  then
        dbms_output.put_line('Cannot store the value!');
end;

答案 1 :(得分:1)

VALUE_ERROR不是您运行代码时引发的异常,如果需要,您可以定义一个EXCEPTION并捕获它,请参阅下面的示例代码,

DECLARE
   ORA_12899 EXCEPTION;
   PRAGMA EXCEPTION_INIT(ORA_12899, -12899);
begin
    insert into department values(1, 'Some random department name', 'SomeLocation');
exception
    when ORA_12899 then
        dbms_output.put_line('Cannot store the value!');
end;
/

下面的代码将有一个VALUE_ERROR;

DECLARE
   ORA_12899 EXCEPTION;
   PRAGMA EXCEPTION_INIT(ORA_12899, -12899);
   v_dept VARCHAR2(20);
begin
    v_dept := 'Some random department name';
    insert into department values(1, v_dept, 'SomeLocation');
exception
    when ORA_12899 then
        dbms_output.put_line('Cannot store the value!');
end;
/