有奖活动:PL/SQL Challenge 每日一题:2013-2-4 VALUE_ERROR异常

[复制链接]
查看11 | 回复9 | 2008-9-15 01:28:12 | 显示全部楼层 |阅读模式
最先答对且答案未经编辑的puber将获得奥运章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得奥运章一枚。
以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808
http://www.itpub.net/thread-1499223-1-1.html
原始出处:
http://www.plsqlchallenge.com/
作者:Steven Feuerstein
运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品
我创建了这张表:
CREATE TABLE plch_data (name VARCHAR2 (10))
/
哪些选项在执行之后会显示 "Caught it!" ?
(A)
DECLARE
l_name VARCHAR (10);
BEGIN
l_name := 'Martin Luther King, Jr.';
EXCEPTION
WHEN VALUE_ERROR
THEN
DBMS_OUTPUT.put_line ('Caught it!');
END;
/


(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;
/



回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
D, F
a, b,c 会截断
e 不会出错
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
选择
A
B
C
D

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
修正: 答案是A C D
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
补充:
关于ORACLE在STANDARD包中提供的预定义异常,只是捕捉-06502“将一个变量赋值给另外一个不兼容的变量”
只有A C D是符合这个异常定义的。
其他例如E,是参数类型或者个数不符合,在上期题目中的CASE B_FLAG WHEN TRUE THEN TRUE...就是为了规避该类异常。
F是INVALID_NUMBER。
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
私水流年 发表于 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引擎处理?
求高手解答。
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
A,C,D
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
udfrog 发表于 2013-2-6 10:21
答案ACD,试了才知道。
你这样的解释其实是在迎合答案,其他都好说,但是怎么解释D和F的区别,即便是F, ...

ORACLE的错误码以万为单位.
输出 SQLCODE 协助研究一下?
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
私水流年 发表于 2013-2-6 10:40
ORACLE的错误码以万为单位.
输出 SQLCODE 协助研究一下?

什么意思,怎么弄?
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
udfrog 发表于 2013-2-6 11:07
什么意思,怎么弄?
DECLARE
L_NUMBER NUMBER (3);
BEGIN
SELECT ABS('ABC') INTO L_NUMBER FROM DUAL;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE (SQLCODE);
DBMS_OUTPUT.PUT_LINE (SQLERRM);
END;
/复制代码Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
11:29:57 ChenZw> DECLARE
11:30:08 2 L_NUMBER NUMBER (3);
11:30:08 3BEGIN
11:30:08 4 SELECT ABS('ABC') INTO L_NUMBER FROM DUAL;
11:30:08 5EXCEPTION
11:30:08 6 WHEN OTHERS
11:30:08 7 THEN
11:30:08 8DBMS_OUTPUT.PUT_LINE (SQLCODE);
11:30:08 9DBMS_OUTPUT.PUT_LINE (SQLERRM);
11:30:0810END;
11:30:0811/
-1722
ORA-01722: 无效数字
PL/SQL 过程已成功完成。
已用时间:00: 00: 00.01
11:30:10 ChenZw>
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行