(B)
BEGIN
INSERT INTO plch_data
VALUES ('Martin Luther King, Jr.');
EXCEPTION
WHEN VALUE_ERROR
THEN
DBMS_OUTPUT.put_line ('Caught it!');
END;
/
(C)
DECLARE
l_number NUMBER (3);
BEGIN
l_number := 1000;
EXCEPTION
WHEN VALUE_ERROR
THEN
DBMS_OUTPUT.put_line ('Caught it!');
END;
/
(D)
DECLARE
l_number NUMBER (3);
BEGIN
l_number := 'abc';
EXCEPTION
WHEN VALUE_ERROR
THEN
DBMS_OUTPUT.put_line ('Caught it!');
END;
/
(E)
BEGIN
DBMS_OUTPUT.put_line (TRUE);
EXCEPTION
WHEN VALUE_ERROR
THEN
DBMS_OUTPUT.put_line ('Caught it!');
END;
/
(F)
DECLARE
l_number NUMBER (3);
BEGIN
SELECT ABS('abc') INTO l_number FROM dual;
EXCEPTION
WHEN VALUE_ERROR
THEN
DBMS_OUTPUT.put_line ('Caught it!');
END;
/
补充:
关于ORACLE在STANDARD包中提供的预定义异常,只是捕捉-06502“将一个变量赋值给另外一个不兼容的变量”
只有A C D是符合这个异常定义的。
其他例如E,是参数类型或者个数不符合,在上期题目中的CASE B_FLAG WHEN TRUE THEN TRUE...就是为了规避该类异常。
F是INVALID_NUMBER。
私水流年 发表于 2013-2-6 06:31
补充:
关于ORACLE在STANDARD包中提供的预定义异常,只是捕捉-06502“将一个变量赋值给另外一个不兼容的变 ...
答案ACD,试了才知道。
你这样的解释其实是在迎合答案,其他都好说,但是怎么解释D和F的区别,即便是F,也有很多种衍生的写法,或caught或not。
所以最初我觉得,value_error的本质是来捕获plsql的异常,而不是sql的,所以F才不会被捕获。
trainer@ORCL> DECLARE
l_number NUMBER (3);
BEGIN
l_number:=abs('abc');
EXCEPTION
WHEN VALUE_ERROR
THEN
DBMS_OUTPUT.put_line ('Caught it!');
END;
/
23456789 10Caught it!
PL/SQL procedure successfully completed.
但是,
trainer@ORCL> DECLARE
l_number NUMBER (3);
BEGIN
SELECT 'abc' INTO l_number FROM dual;
EXCEPTION
WHEN VALUE_ERROR
THEN
DBMS_OUTPUT.put_line ('Caught it!');
END;
/
23456789 10Caught it!
所以前一结论直接推翻了。
按照理解,'abc'赋值给number,肯定有个to_number发生,所以我给它加上
结果我擦
trainer@ORCL> DECLARE
l_number NUMBER (3);
BEGIN
SELECT to_number('abc') INTO l_number FROM dual;
EXCEPTION
WHEN VALUE_ERROR
THEN
DBMS_OUTPUT.put_line ('Caught it!');
END;
/
23456789 10DECLARE
*
ERROR at line 1:
ORA-01722: invalid number
ORA-06512: at line 4
到这,我找不到结论了。
只是,从ORA-06502: PL/SQL: numeric or value error这个信息来看,它应该确实是为了捕获plsql的异常吧,那SELECT 'abc' INTO l_number FROM dual;也能被捕获是因为这句是plsql引擎在执行?这不科学啊,expert pl/sql practices明确说了这会有上下文切换,难道现在不是了?
而SELECT to_number('abc') INTO l_number FROM dual;不会被捕获,是因为多了个函数,才被sql引擎处理?
求高手解答。