这是我的部门表:
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上的所有代码
答案 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;
/